Магические методы в PHP5

Так получилось что в ООП функции называют — методами а переменные — свойствами. В 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"
}

http://ru.php.net/manual/ru/language.oop5.magic.php

Оставьте комментарий