Me va a utilizar el siguiente ejemplo para ilustrar mi pregunta:¿Hay alguna forma de redefinir una sugerencia de tipo a una clase descendiente al extender una clase abstracta?
class Attribute {}
class SimpleAttribute extends Attribute {}
abstract class AbstractFactory {
abstract public function update(Attribute $attr, $data);
}
class SimpleFactory extends AbstractFactory {
public function update(SimpleAttribute $attr, $data);
}
Si intenta ejecutar esto, PHP arrojará un error fatal, diciendo que el Declaration of SimpleFactory::update() must be compatible with that of AbstractFactory::update()
entiendo exactamente lo que esto significa: La firma del método SimpleFactory::update()
s debe coincidir exactamente con la de su clase abstracta principal.
Sin embargo, mi pregunta: ¿hay alguna manera de permitir que el método concreto (en este caso, SimpleFactory::update()
) redefina la sugerencia de tipo a un descendiente válido de la pista original?
Un ejemplo podría ser el operador instanceof
, que devolvería cierto en el caso siguiente:
SimpleAttribute instanceof Attribute // => true
Soy consciente de que a medida que una solución alternativa, que podría hacer que el tipo de indicio de la misma en el método concreto, y haga una instancia de verificación en el propio cuerpo del método, pero ¿hay alguna manera de simplemente hacer cumplir esto en el nivel de la firma?
+1 Me encantaría ver si esto también es posible, aunque por mi vida no puedo entender cómo. Tal vez PHP6 tendrá soporte mejorado para la sobrecarga de métodos y detectará múltiples firmas de métodos *, por lo que 'actualización de función pública abstracta (atributo $ attr, $ data)' y 'actualización de función pública abstracta (SimpleAttribute $ attr, $ data)' podría co- existir en el mismo alcance de clase – leepowers