Welcome to php club

PHP FAQ from PHPclub.ru: PHP5/Overload ...

Начало | Каталог | Изменения | НовыеКомментарии | Вам запрещён доступПользователи | Вам запрещён доступРегистрация | Вход:  Пароль:  

Перегружаемые доступ к свойствам и вызовы методов

Краткое описание

Очередной новой возможностью ООП PHP5 стала перегрузка. С помощью магических методов __get(), __set() и __call() возможна перегрузка обращений как к свойствам, так и к методам. __get() и __set() вызываются при установке и получении значения свойства, соответственно. __call() — при вызове метода. Однако магические функции будут вызывать в том и только в том случае, когда запрошенные метод/свойство не существуют!

Доступ к свойствам

Метод __get() вызывается с одним параметром — именем свойства, метод __set() с двумя — именем свойства и значением, которое нужно ему присвоить.
Пример:

<?php
class Setter {
    public
$n;
    public
$x = array('a' => 1, 'b' => 2, 'c' => 3);

    function
__get($nm) {
        echo
"Получаем [$nm]\n";

        if (isset(
$this->x[$nm])) {
            
$r = $this->x[$nm];
            echo
"Возвращаем: $r\n";
            return
$r;
        } else {
            echo
"Ничего!\n";
        }
    }

    function
__set($nm, $val) {
        echo
"Устанавливаем [$nm] в $val\n";

        if (isset(
$this->x[$nm])) {
            
$this->x[$nm] = $val;
            echo
"Хорошо!\n";
        } else {
            echo
"Плохо!\n";
        }
    }
}

$foo = new Setter();
$foo->n = 1;
$foo->a = 100;
$foo->a++;
$foo->z++;
var_dump($foo);
?>

Результат:

Вызов методов

Магический метод __call() вызывается с двумя параметрами — именем метода и массивом параметров.
Пример:

<?php
class Caller {
    public
$x = array(1, 2, 3);

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

$foo = new Caller();
$a = $foo->test(1, "2", 3.4, true);
echo
"Возвращенное значение:\n";
var_dump($a);
?>

Результат:

Проблемы с обратной совместимостью

Старый код c классами без методов __get(), __set() и __call() должен работать без изменений.

Дополнительная информация

Описание в оригинальной документации: http://www.php.net/oop5.overloading


 
Комментариев нет. [Показать комментарии/форму]