Интерфейсы объектов
Итераторы объектов
Классы и объекты (PHP 5)
PHP Manual

## Перегрузка

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

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

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

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

Пример #1 Пример перегрузки с использование __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(), будет передано вызывающему оператору.

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

Интерфейсы объектов
Итераторы объектов
Классы и объекты (PHP 5)
PHP Manual