Ho chiesto la stessa domanda oggi, e vorrei aggiungere i miei due centesimi.
La ragione per cui desideriamo le proprietà abstract
è assicurarsi che le sottoclassi le definiscano e generino eccezioni quando non lo fanno. Nel mio caso specifico, avevo bisogno di qualcosa che potesse funzionare con l'alleato static
.
Idealmente vorrei qualcosa di simile:
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.
}
Ho finito con questa implementazione
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
{
}
Come si può vedere, in A
io non definisco $prop
, ma lo uso in un getter static
. Pertanto, il seguente codice funziona
B::getProp();
// => 'B prop'
$b = new B();
$b->getProp();
// => 'B prop'
In C
, d'altra parte, non mi definisco $prop
, in modo da ottenere eccezioni:
C::getProp();
// => Exception!
$c = new C();
$c->getProp();
// => Exception!
devo chiamare il metodo getProp()
per ottenere l'eccezione e non riesco a farlo caricare in classe, ma è abbastanza vicino al comportamento desiderato, almeno nel mio caso.
mi definiscono getProp()
come final
per evitare che alcuni ragazzo intelligente (aka me stesso in 6 mesi) è tentati di fare
class D extends A {
public static function getProp() {
// really smart
}
}
D::getProp();
// => no exception...
+1: Ben spiegato. – hakre
Non vi è alcun motivo ovvio per cui la parola "abstract" non possa essere utilizzata su proprietà * static * - ma con un significato leggermente diverso. Ad esempio potrebbe indicare che una sottoclasse deve fornire un valore per la proprietà. – frodeborli