Прихващане на достъп до несъществуващи обектни свойства в PHP5
Програмиране за Web и LifeHack
В строги езици за програмиране, като C++ и Java, програмистът трябва изрично да дефинира какви свойства има определен клас и изрично да посочи техния обхват (публичен, защитен или частен). PHP4 нямаше тази строгост и в някои случаи това доведе до грешки, които са трудни за улавяне.
В PHP5 свойствата на класа имат обхвати и всичко е станало повече или по-малко строго. Достъп до несъществуващо статично свойство на клас
води до фатална грешка: „Фатална грешка: Достъп до недекларирано статично свойство: A::$myVar в C:\test.php на ред 7“. За съвместимост с PHP4 обаче не се генерират грешки при достъп до свойството на обект. В PHP4 можете да разширите обект, като добавите нови свойства към него точно по време на изпълнение, като това:
Разбира се, в никакъв случай не трябва да правите това нито в 4-та, нито в 5-та версия на PHP, но PHP не го ругае. Често, поради невнимание, можете да направите грешка при писане на името на свойство на обект (например да объркате регистъра на буквите). В случай на четене на несъществуващо свойство, ще получите „Забележка: Недефинирано свойство: A::$MyVar в C:\1\test3.php на ред 10″. И в случай на присвояване на стойност, няма съобщения. Просто вместо да променяте стойността на имота, вие ще създадете нов имот, който при всичко това ще има публичен обхват. Хващането на такава грешка обикновено е доста трудно, затова предлагам решение, което ви позволява да уловите опит за задаване на стойност за несъществуващо свойство на обект в PHP5.
Моето решение се основава на създаване на базов клас за всички класове, който използва претоварване на свойства чрез методите __get() и __set(). Този базов клас изглежда така:
И ние декларираме всички наши класове като наследници на ClassBase:
Изпълнението на този пример ще хвърли изключение, което, ако не бъде уловено чрез, ще доведе до срив на скрипта с грешка „Фатална грешка: Неуловено изключение „Изключение“ със съобщение „Опит за задаване на стойност на недефинирано свойство $MyVar на клас A“ в C:\work\test.php:10″.
Просто и елегантно. Строго погледнато, моето решение не е нищо повече от синтактична сол за езика PHP5 по отношение на работата с ООП.