Perché in PHP 7 non è possibile dichiarare un'interfaccia con un tipo di ritorno static
?tipo di ritorno statico in PHP 7 interfacce
Diciamo Ho le seguenti classi:
interface BigNumber {
/**
* @param BigNumber $that
*
* @return static
*/
public function plus(BigNumber $that);
}
class BigInteger implements BigNumber { ... }
class BigDecimal implements BigNumber { ... }
voglio rispettare il tipo di ritorno del metodo plus()
-static
, cioè:
BigInteger::plus()
deve restituire unBigInteger
BigDecimal::plus()
deve restituire unBigDecimal
posso dichiarare l'interfaccia nel modo seguente:
public function plus(BigNumber $that) : BigNumber;
Ma ciò non rispettare la precedenza. Quello che vorrei fare è:
public function plus(BigNumber $that) : static;
Ma PHP 7, ad oggi, non è soddisfatto:
PHP Parse error: syntax error, unexpected 'static' (T_STATIC)
C'è una ragione specifica per questo, o si tratta di un bug che dovrebbe essere segnalato?
Invarianza di tipo, ecco perché. I metodi di implementazione/sovrascrittura devono corrispondere esattamente al tipo in PHP; 'static' no - ovviamente, perché si riferisce al contesto corrente e quindi non può essere invarianza. –