Warum gibt es in PHP keine Möglichkeit, statische Eigenschaften zu überladen?

13

Intro

Mit PHP können Sie Methodenaufrufe und Eigenschaftenzugriffe überladen, indem Sie magische Methoden in Klassen deklarieren . Dies ermöglicht Code wie:

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

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

Neben dem Überladen von Instanzeigenschaften und Methoden können wir seit PHP 5.3.0 auch staticMethodenaufrufe überladen, indem wir die magic-Methode überschreiben __callStatic.

Etwas fehlt

Was in der verfügbaren Funktionalität auffällig fehlt, ist die Fähigkeit, statische Eigenschaften zu überladen , zum Beispiel:

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

Diese Einschränkung ist eindeutig dokumentiert :

Das Überladen von Eigenschaften funktioniert nur im Objektkontext. Diese magischen Methoden werden im statischen Kontext nicht ausgelöst. Daher sollten diese Methoden nicht deklariert werden static. Ab PHP 5.3.0 wird eine Warnung ausgegeben, wenn eine der magischen Überladungsmethoden deklariert ist static.

Aber wieso?

Meine Fragen sind:

  1. Gibt es einen technischen Grund dafür, dass diese Funktionalität derzeit nicht unterstützt wird? Oder vielleicht ein (schauderhafter) politischer Grund?
  2. Wurden in der Vergangenheit Versuche abgebrochen, diese Funktionalität hinzuzufügen?

Vor allem ist die Frage nicht "Wie kann ich dynamische statische Eigenschaften in userland PHP haben?". Das heißt, wenn Sie eine besonders nette Implementierung kennen, die darauf basiert, __callStaticdass Sie teilen möchten, dann tun Sie dies auf jeden Fall.

Jon
quelle

Antworten:

11

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

Wurde in PHP 5.3 statische Memberüberladung hinzugefügt? Mir ist aufgefallen, dass das Überladen statischer Methoden (__callStatic) war. Die beiden würden sich ergänzen, und es erscheint nur natürlich, diese auch hinzuzufügen. Mir ist aufgefallen, dass sie nicht zu den RFCs der "statischen Klasse" und einem Fehlerbericht gehören, aber es wäre schön, diese in 5.3 zu sehen. Mit diesem Zusatz und LSB können PHP-Klassen so viel tun! Ex:

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

Zitierendes Follow-up http://marc.info/?l=php-internals&m=121578318524848&w=2

Wenn der RFC für statische Klassen akzeptiert wird, sind Interceptors für statische Eigenschaften Teil der nächsten PHP-Hauptversion (möglicherweise 5.4 oder 6). Also wird es nicht zu 5.3, aber wir werden es hoffentlich in Zukunft haben.

Link zu statischen Klassen RFC:

Der Status des RFC ist "in Arbeit", aber angesichts dessen, dass er aus dem Jahr 2008 stammt, können Sie auf der Mailingliste von php.internals oder auf # php.pecl im EFNet-IRC nachfragen, was daraus geworden ist.

Gordon
quelle
Vielen Dank, Gordon, wie immer sehr hilfreich. ;-) Während der RFC für statische Klassen Unterstützung für __getStatic()und __setStatic()für statische Klassen vorzuschlagen scheint , wäre es dennoch nützlich, diese Funktionalität für instanziierbare Klassen zu haben. Sind Ihnen Bewegungen in diese Richtung bekannt?
David Weinraub
@ DavidWeinraub Nein, sorry. Tbh, ich interessiere mich nicht für Dinge, die mit statischen Methoden zusammenhängen. Ich finde fast nie eine gute Verwendung für sie und sie führen zu einer schlechten Kopplung und schmerzhaften Tests.
Gordon
Absolute Zustimmung! ;-) Aber einige Frameworks, die mir auf den Fersen sind, verwenden Statik als Modellebene. __getStatic()würde es mir ermöglichen, einen Großteil meines vorhandenen Codes auszutrocknen. Vielen Dank!
David Weinraub