Руководство по PHP
Пред. | Глава 19. Классы и объекты (PHP 5) | След.

# Перегрузка

Вызовы методов, как и обращения к свойствам объекта, могут быть перегружены с использованием методов __call, __get и __set. Эти методы будут срабатывать только в том случае, если объект или наследуемый объект не содержат свойства или метода, к которому осуществляется доступ.

## Перегрузка свойств

void __set ( string имя, mixed значение )
void __get ( mixed имя )

С помощью этих методов обращения к свойствам класса могут быть перегружены с целью выполнения произвольного кода, описанного в классе. В аргументе имя передаётся имя свойства, к которому производится обращение. Аргумент значение метода __set() должен содержать значение, которое будет присвоено свойству класса с именем имя.

Пример 19-18. Пример перегрузки с использование __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) } }`

## Перегрузка методов

mixed __call ( string имя, array аргументы )

С использованием этого метода, методы класса могут быть перегружены с целью выполнения произвольного кода, описанного в классе. В аргументе имя передаётся имя вызванного метода. Аргументы, которые были переданы методу при обращении, будут возвращены чере аргументы. Значение, возвращённое методом __call(), будет передано вызывающему оператору.

Пример 19-19. Пример перегрузки с использованием __call
`<?php class Caller { private $x = array(1, 2, 3); function __call($m, $a) { print "Вызван метод $m :\n"; var_dump($a); return $this->x; } } $foo = new Caller(); $a = $foo->test(1, "2", 3.4, true); var_dump($a); ?>`
Результатом выполнения будет:
`Вызван метод test: array(4) { [0]=> int(1) [1]=> string(1) "2" [2]=> float(3.4) [3]=> bool(true) } array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }`

Пред. | Начало | След.
Интерфейсы объектов | Уровень выше | Итераторы объектов