Hoy me hice la misma pregunta y me gustaría agregar mis dos centavos.
La razón por la que nos gustaría tener abstract
propiedades es para asegurarnos de que las subclases las definan y arrojen excepciones cuando no lo hacen. En mi caso específico, necesitaba algo que pudiera funcionar con static
aliado.
Idealmente me gustaría algo como esto:
abstract class A {
abstract protected static $prop;
}
class B extends A {
protected static $prop = 'B prop'; // $prop defined, B loads successfully
}
class C extends A {
// throws an exception when loading C for the first time because $prop
// is not defined.
}
Terminé con esta implementación
abstract class A
{
// no $prop definition in A!
public static final function getProp()
{
return static::$prop;
}
}
class B extends A
{
protected static $prop = 'B prop';
}
class C extends A
{
}
Como puede ver, en A
No lo defino $prop
, pero lo uso en un static
captador. Por lo tanto, el siguiente código funciona
B::getProp();
// => 'B prop'
$b = new B();
$b->getProp();
// => 'B prop'
En C
, por otro lado, no defino $prop
, por lo que obtengo excepciones:
C::getProp();
// => Exception!
$c = new C();
$c->getProp();
// => Exception!
Debo llamar al getProp()
método para obtener la excepción y no puedo obtenerlo al cargar la clase, pero está bastante cerca del comportamiento deseado, al menos en mi caso.
Defino getProp()
como final
evitar que algún tipo inteligente (también conocido como yo en 6 meses) tenga la tentación de hacer
class D extends A {
public static function getProp() {
// really smart
}
}
D::getProp();
// => no exception...