Перехоплення звернення до неіснуючих властивостей об’єктів у PHP5
Програмування для Web та LifeHack
У строгих мовах програмування типу C++ і Java програміст зобов'язаний явно визначати якими властивостями має той чи інший клас, причому явно вказуючи їх області видимості (public, protected чи private). У PHP4 такої суворості не було і в деяких випадках це призводило до помилок, які досить важко відловити.
У PHP5 у властивостей класів з'явилися області видимості і все стало більш-менш суворо. Звернення до неіснуючої статичної властивості класу
призводить до фатальної помилки: "Fatal error: Access до undeclared static property: A::$myVar in C:\test.php on line 7". Однак, для сумісності з PHP4 при зверненні до якості об'єкта жодних помилок не генерується. У PHP4 ви могли розширити об'єкт, додавши в нього нові властивості прямо в runtime ось так:
Зрозуміло, робити так ні в якому разі не потрібно ні в 4-ій, ні в 5-ій версії PHP, але PHP на це не свариться. Часто внаслідок неуважності Ви можете помилитися в написанні імені властивості об'єкта (наприклад, переплутати регістр літер). У разі читання неіснуючої властивості Ви отримаєте "Notice: Undefined property: A::$MyVar in C:\1\test3.php on line 10". А у разі надання значення — жодних повідомлень. Просто замість зміни значення якості ви створите нову властивість, яка при цьому буде мати область видимості public. Відловити таку помилку зазвичай досить важко, тому я пропоную рішення, яке дозволяє відловлювати спробу встановлення значення для неіснуючої властивості об'єкта PHP5.
Моє рішення засноване на створенні базового класу для всіх класів, який використовує перевантаження властивостей методами __get() і __set(). Цей базовий клас виглядає так:
І оголошуємо всі наші класи нащадками від ClassBase:
При виконанні даного прикладу спрацює Exception, який якщо не відловити через , призведе до аварійного завершення скрипту з помилкою “Fatal error: Uncaught exception 'Exception' with message \test.php:10″.
Просто та елегантно. Строго кажучи, моє рішення є ні що інше як синтаксична сіль для мови PHP5 щодо роботи з ООП.