Почему в PHP нет возможности перегрузить статические свойства?


13

вступление

PHP позволяет перегружать вызовы методов и доступ к свойствам , объявляя магические методы в классах. Это включает код, такой как:

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

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

Помимо перегрузки свойств и методов экземпляра, начиная с PHP 5.3.0, мы также можем перегружать staticвызовы методов, переопределяя магический метод __callStatic.

Что-то пропало

Чего явно не хватает в доступной функциональности, так это возможности перегрузки статических свойств , например:

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

Это ограничение четко задокументировано :

Перегрузка свойств работает только в контексте объекта. Эти магические методы не будут запускаться в статическом контексте. Поэтому эти методы не должны быть объявлены static. Начиная с PHP 5.3.0, выдается предупреждение, если объявлен один из магических методов перегрузки static.

Но почему?

Мои вопросы:

  1. Есть ли техническая причина, по которой эта функция в настоящее время не поддерживается? Или, может быть, (дрожь) политическая причина?
  2. Были ли какие-либо прерванные попытки добавить эту функцию в прошлом?

Самое главное, вопрос не в том, «как я могу иметь динамические статические свойства в пользовательском PHP?». Тем не менее, если вы знаете об очень симпатичной реализации, основанной на __callStaticтом, что вы хотите поделиться, то обязательно сделайте это.

Ответы:


11

Цитирование http://marc.info/?l=php-internals&m=121578194822276&w=2

Была ли добавлена ​​перегрузка статических элементов в PHP 5.3? Я заметил, что перегрузка статического метода была (__callStatic). Эти два дополнения друг друга, и это просто кажется естественным, чтобы добавить их. Я заметил, что они не относятся к RFC «статического класса» и отчету об ошибках, но было бы неплохо увидеть их в 5.3. С этим дополнением и LSB классы php могут сделать так много! Пример:

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

Цитирование последующей деятельности http://marc.info/?l=php-internals&m=121578318524848&w=2

если будет принят RFC для статических классов, перехватчики статических свойств будут частью следующей основной версии PHP (может быть, 5.4 или 6). Так что он не выйдет в 5.3, но мы надеемся, что это произойдет в будущем.

Ссылка на статические классы RFC:

Статус RFC «находится в разработке», но, учитывая, что он с 2008 года, вы можете попросить в списке рассылки php.internals или в # php.pecl в IRC EFNet узнать, что с ним случилось.


Спасибо, Гордон, очень помог, как обычно. ;-) Хотя статические классы RFC , кажется, предлагает поддержку __getStatic()и __setStatic()на статических классах, все равно было бы полезно иметь эту функцию для инстанциируемых классов. Вам известны какие-либо шаги в этом направлении?
Дэвид Вайнрауб

@ DavidWeinraub Нет, извините. Тебе все равно, что связано со статическими методами. Я почти никогда не нахожу для них никакой пользы, и они приводят к плохой связи и мучительным испытаниям.
Гордон

Абсолютно согласен! ;-) Но некоторые фреймворки, которые мне навязывают, используют статику для своего модельного слоя. __getStatic()позволит мне высушить большую часть моего существующего кода. Благодарность!
Дэвид Вайнрауб
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.