Considerate le seguenti interfacce PHP:È possibile sovrascrivere i metodi di interfaccia con firme diverse, ma "compatibili"?
interface Item {
// some methods here
}
interface SuperItem extends Item {
// some extra methods here, not defined in Item
}
interface Collection {
public function add(Item $item);
// more methods here
}
interface SuperCollection extends Collection {
public function add(SuperItem $item);
// more methods here that "override" the Collection methods like "add()" does
}
sto usando PhpStorm, e quando faccio questo, ottengo un errore nell'IDE che indica sostanzialmente la definizione per add()
in SuperCollection
non è compatibile con la definizione di cui l'interfaccia si estende, Collection
.
In un modo, posso vedere che questo è un problema, poiché la firma del metodo non corrisponde a quella "sostituisce" esattamente. Tuttavia, ritengo che ciò sarebbe compatibile, poiché SuperItem
estende Item
, quindi vedrei lo add(SuperItem)
lo stesso di add(Item)
.
Sono curioso di sapere se questo è supportato da PHP (versione 5.4 o successiva) e forse l'IDE ha un bug che non lo rileva correttamente.
In 5.3, ottengo "Errore fatale: Dichiarazione di SuperCollection :: add() deve essere compatibile con quella della Collezione :: aggiungere ()". Quindi sembra che PhpStorm sia corretto. Perché pensi che 5.4 potrebbe comportarsi in modo diverso? – halfer