Вызовы методов, как и обращения к свойствам объекта, могут быть перегружены с использованием методов __call, __get и __set. Эти методы будут срабатывать только в том случае, если объект или наследуемый объект не содержат свойства или метода, к которому осуществляется доступ.
Перегрузка свойств
void __set ( string имя, mixed значение )
void __get ( mixed имя )
С помощью этих методов обращения к свойствам класса могут быть перегружены с целью выполнения произвольного кода, описанного в классе. В аргументе имя передаётся имя свойства, к которому производится обращение. Аргумент значение метода __set() должен содержать значение, которое будет присвоено свойству класса с именем имя.
Пример перегрузки с использование __get и __set:
<?php class Setter { public $n; private $x = array("a" => 1, "b" => 2, "c" => 3); function __get($nm) { print "ЧИтаем [$nm]\n"; if (isset($this->x[$nm])) { $r = $this->x[$nm]; print "Получили: $r\n"; return $r; } else { print "Ничего!\n"; } } function __set($nm, $val) { print "Пишем $val в [$nm]\n"; if (isset($this->x[$nm])) { $this->x[$nm] = $val; print "OK!\n"; } else { print "Всё плохо!\n"; } } } $foo = new Setter(); $foo->n = 1; $foo->a = 100; $foo->a++; $foo->z++; var_dump($foo); ?>
Результатом выполнения будет:
Пишем 100 в [a]
OK!
Читаем [a]
Получили: 100
Пишем 101 в [a]
OK!
Читаем [z]
Ничего!
Пишем 1 в [z]
Всё плохо!
object(Setter)#1 (2) {
["n"]=>
int(1)
["x:private"]=>
array(3) {
["a"]=>
int(101)
["b"]=>
int(2)
["c"]=>
int(3)
}
}