Чому в 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 IRN EFTet, щоб дізнатися, що з цього сталося.


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

@DavidWeinraub nope, вибач. Tbh, мені не цікаво, що стосується статичних методів. Я майже ніколи не знаходжу для них корисного використання, і вони призводять до поганих зв'язків і болісного тестування.
Гордон

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