Perché non esiste alcuna possibilità di sovraccaricare le proprietà statiche in PHP?

13

Introduzione

PHP consente di sovraccaricare le chiamate ai metodi e accessi alle proprietà di dichiarando metodi magici nelle classi. Questo abilita codice come:

class Foo {
    public function __get($name) { return 42; }
}

$foo = new Foo;
echo $foo->missingProperty; // prints "42"

Oltre a sovraccaricare le proprietà e i metodi dell'istanza, dal PHP 5.3.0 possiamo anche sovraccaricare i metodi static chiamate sovrascrivendo il metodo magico __callStatic .

Manca qualcosa

Ciò che manca vistosamente dalle funzionalità disponibili è la possibilità di sovraccaricare proprietà statiche , ad esempio:

echo Foo::$missingProperty; // fatal error: access to undeclared static property

Questa limitazione è chiaramente documentato :

Property overloading only works in object context. These magic methods will not be triggered in static context. Therefore these methods should not be declared static. As of PHP 5.3.0, a warning is issued if one of the magic overloading methods is declared static.

Ma perché?

Le mie domande sono:

  1. C'è una ragione tecnica per cui questa funzionalità non è attualmente supportata? O forse una ragione politica (rabbrividente)?
  2. Sono stati interrotti i tentativi di aggiungere questa funzionalità in passato?

Soprattutto, la domanda non è "come posso avere proprietà statiche dinamiche in userland PHP?". Detto questo, se sei a conoscenza di un'implementazione particolarmente carina basata su __callStatic che desideri condividere, fallo assolutamente.

    
posta Jon 20.03.2012 - 11:33
fonte

1 risposta

11

Citando link

Was static member overloading added in PHP 5.3? I noticed that static method overloading was (__callStatic). The two would complement each other and it just seems natural to add these as well. I did notice that they are apart of the "static-class" RFC and a bug report, but it would be nice to see these in 5.3. With this addition and LSB, php classes can do so much! Ex:

__setStatic()
__getStatic()
__issetStatic()
__unsetStatic()

Quoting follow-up link

if the RFC for static classes will be accepted, static property interceptors will be a part of the next PHP major version (might it be 5.4 or 6). So it won't make it into 5.3, but we will have that hopefully in the future.

Collegamento a classi statiche RFC:

Lo stato della RFC è "in lavorazione" ma dato che è del 2008 potresti voler chiedere sulla mailing list php.internals o su # php.pecl su EFNet IRC per scoprire che ne è diventato .

    
risposta data 20.03.2012 - 12:06
fonte

Leggi altre domande sui tag