Dlaczego w PHP nie ma możliwości przeciążenia właściwości statycznych?

13

Wprowadzenie

PHP pozwala przeciążać wywołania metod i dostęp do właściwości , deklarując magiczne metody w klasach. Umożliwia to kod taki jak:

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

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

Oprócz przeciążania właściwości i metod instancji, od PHP 5.3.0 możemy również przeciążać staticwywołania metod, zastępując magiczną metodę __callStatic.

Czegoś brakuje

W widocznej funkcji brakuje wyraźnie możliwości przeciążenia właściwości statycznych , na przykład:

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

To ograniczenie jest wyraźnie udokumentowane :

Przeciążanie właściwości działa tylko w kontekście obiektowym. Te magiczne metody nie będą uruchamiane w kontekście statycznym. Dlatego te metody nie powinny być deklarowane static. Począwszy od PHP 5.3.0, pojawia się ostrzeżenie, jeśli zadeklarowano jedną z magicznych metod przeciążania static.

Ale dlaczego?

Moje pytania to:

  1. Czy istnieje techniczny powód, dla którego ta funkcja nie jest obecnie obsługiwana? A może (dreszcz) powód polityczny?
  2. Czy w przeszłości podejmowano próby przerwania tej funkcji?

Co najważniejsze, pytanie nie brzmi „jak mogę mieć dynamiczne właściwości statyczne w PHP użytkownika?”. To powiedziawszy, jeśli znasz szczególnie uroczą implementację opartą na __callStatictym, którą chcesz się podzielić, to zrób to.

Jon
źródło

Odpowiedzi:

11

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

Czy w PHP 5.3 dodano statyczne przeciążenie elementów? Zauważyłem, że statyczne przeciążenie metody to (__callStatic). Te dwa elementy będą się uzupełniać, a ich dodanie wydaje się naturalne. Zauważyłem, że różnią się one od „klasy statycznej” RFC i raportu o błędzie, ale byłoby miło zobaczyć je w 5.3. Dzięki temu dodatkowi i LSB klasy php mogą wiele zrobić! Dawny:

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

Cytując działania następcze http://marc.info/?l=php-internals&m=121578318524848&w=2

jeśli RFC dla klas statycznych zostanie zaakceptowany, przechwytywacze właściwości statycznych będą częścią następnej głównej wersji PHP (może to być 5,4 lub 6). Więc nie znajdzie się w 5.3, ale mamy nadzieję, że będziemy mieli taką nadzieję w przyszłości.

Link do klas statycznych RFC:

Status RFC jest „w toku”, ale biorąc pod uwagę, że pochodzi z 2008 roku, możesz zapytać na liście mailingowej php.internals lub na # php.pecl na EFNet IRC, aby dowiedzieć się, co się z nim stało.

Gordon
źródło
Dzięki, Gordon, jak zwykle bardzo pomocny. ;-) Podczas gdy RFC klas statycznych wydaje się proponować wsparcie dla klas statycznych__getStatic() i __setStatic()na nich , nadal przydatne byłoby posiadanie tej funkcji dla klas możliwych do utworzenia. Czy zdajesz sobie sprawę z jakichkolwiek ruchów w tym kierunku?
David Weinraub
@DavidWeinraub nie, przepraszam. Tbh, nie dbam o rzeczy związane z metodami statycznymi. Prawie nigdy nie znajduję dla nich dobrego zastosowania, co prowadzi do złego połączenia i bolesnych testów.
Gordon
Absolutnie się zgadzam! ;-) Ale niektóre frameworki, które są narzucone mi, używają statyki dla ich warstwy modelowej. __getStatic()umożliwiłbym WYSUSZENIE dużej części mojego istniejącego kodu. Dzięki!
David Weinraub