Так получилось что в ООП функции называют — методами а переменные — свойствами. В PHP5 существует несколько полезных методов несущих в себе «магический» функционал о них сейчас и пойдет речь.
Все методы начинающиеся с __ PHP считает «магическими».
__construct() — метод конструктор, если он объявлен в классе то он будет вызываться при каждом создании объекта. Может принимать одно или несколько свойств.
__destruct() — деструктор вызывается при освобождении всех ссылок на объект в котором он находится или по завершению работы скрипта. Не может принимать свойства.
__get() — будет выполнен при чтении данных из недоступных свойств.
__set() — будет выполнен при записи данных в недоступные свойства.
__isset() будет выполнен при использовании isset() или empty() на недоступных свойствах.
__unset() будет выполнен при вызове unset() на недоступном свойстве.
__toString() — позволяет написать реакцию класса при возведении его в строку.
__invoke() — вызывается когда скрипт выполняет объект как функцию.
__clone() — клонирует объект.
Смотрим все на примере
<?php class Test { public $name; public $colors = array(); # Свойству класса name теперь равно переданному при создании класса значению public function __construct( $name ) { $this->name = $name; return 1; } # Ловим несуществующее свойство и его значение и отправляем их в массив public function __set( $name, $value ) { $this->colors[$name] = $value; return 1; } # Достаем ранее записанное методом __set() в массив несуществующее свойство public function __get( $name ) { return $this->colors[$name]; } # Обязательное условие - должна выводится именно строка public function __toString() { return $this->name; } # Обрабатываем значение переданное объекту как функции public function __invoke( $x ) { echo "Число состоит из ".strlen( $x )."-х символов\n"; } # Перед уничтожением класса из памяти он может дать о себе знать public function __destruct() { print 'Привет я класс '.__class__.' примерно через 0.00001 секунды я буду уничтожен'; } }
<?php # Создаем объект значение свойства будет передано в метод __construct() $obj = new Test( 'AndreRoux' ); echo $obj->name."\n"; # Выводим сам объект если метод __toString() не контролирует это действие то мы получаем E_RECOVERABLE_ERROR echo $obj."\n"; # Обращаемся к объекту как к функции $obj( 2134 ); # Даем значение несуществующему свойству, далее если оно действительно # не существует за его обработку принимается функция __set() $obj->color = 'red'; # Выводим несуществующее свойство echo $obj->color."\n";
<?php class Foo { private $data = array(); public function __set( $name, $value ) { $this->data[$name] = $value; } public function & __get( $name ) { return $this->data[$name]; } } $foo = new Foo(); $foo->bar[2] = 'lol'; var_dump( $foo->bar );
Результат:
array(1) { [2]=> string(3) "lol" }