Perché non è possibile sovraccaricare le proprietà statiche in PHP?


13

Intro

PHP ti consente di sovraccaricare le chiamate ai metodi e gli accessi alle proprietà dichiarando i 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 delle istanze, da PHP 5.3.0 possiamo anche sovraccaricare le staticchiamate ai metodi ignorando il metodo magico __callStatic.

Manca qualcosa

Ciò che manca in modo evidente alla funzionalità disponibile è la capacità di sovraccaricare le proprietà statiche , ad esempio:

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

Questa limitazione è chiaramente documentata :

Il sovraccarico delle proprietà funziona solo nel contesto dell'oggetto. Questi metodi magici non verranno attivati ​​in un contesto statico. Pertanto, questi metodi non devono essere dichiarati static. A partire da PHP 5.3.0, viene emesso un avviso se viene dichiarato uno dei metodi di sovraccarico magico static.

Ma perché?

Le mie domande sono:

  1. C'è una ragione tecnica per cui questa funzionalità non è attualmente supportata? O forse un (brivido) motivo politico?
  2. Ci sono stati tentativi interrotti di aggiungere questa funzionalità in passato?

Ancora più importante, la domanda non è "come posso avere proprietà statiche dinamiche in PHP userland?". Detto questo, se conosci un'implementazione particolarmente carina basata su __callStaticquella che vuoi condividere, allora fallo.

Risposte:


11

Citando http://marc.info/?l=php-internals&m=121578194822276&w=2

Il sovraccarico di membri statici è stato aggiunto in PHP 5.3? Ho notato che il sovraccarico del metodo statico era (__callStatic). I due si completerebbero a vicenda e sembra naturale aggiungere anche questi. Ho notato che sono parte della RFC di "classe statica" e una segnalazione di bug, ma sarebbe bello vederli in 5.3. Con questa aggiunta e LSB, le classi php possono fare molto! Ex:

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

Citando il seguito http://marc.info/?l=php-internals&m=121578318524848&w=2

se la RFC per le classi statiche verrà accettata, gli intercettori di proprietà statiche faranno parte della prossima versione principale di PHP (potrebbe essere 5.4 o 6). Quindi non lo farà in 5.3, ma lo speriamo in futuro.

Collegamento a classi statiche RFC:

Lo stato della RFC è "in lavorazione" ma dato che è del 2008 potresti chiedere alla mailing list di php.internals o su # php.pecl su EFNet IRC per scoprire che fine ha fatto.


Grazie, Gordon, molto utile, come al solito. ;-) Mentre la RFC delle classi statiche sembra proporre supporto per __getStatic()e __setStatic()sulle classi statiche , sarebbe comunque utile disporre di questa funzionalità per le classi istantanee. Sei a conoscenza di eventuali mosse in questa direzione?
David Weinraub,

@DavidWeinraub no, scusa. Tbh, non mi importa delle cose legate ai metodi statici. Non trovo quasi mai un buon uso per loro e portano a cattivi accoppiamenti e test dolorosi.
Gordon,

Assolutamente d'accordo! ;-) Ma alcuni framework che sono spinti su di me usano la statica per il loro layer modello. __getStatic()mi consentirebbe di ASCIUGARE un sacco del mio codice esistente. Grazie!
David Weinraub,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.