Классы и объекты (PHP 5)
PHP Manual

Перегрузка

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

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

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

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

Example#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->1;
$foo->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(), будет передано вызывающему оператору.

Example#2 Пример перегрузки с использованием __call

<?php
class Caller {
  private 
$x = array(123);

  function 
__call($m$a) {
    print 
"Вызван метод $m :\n";
    
var_dump($a);
    return 
$this->x;
  }
}

$foo = new Caller();
$a $foo->test(1"2"3.4true);
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