Учебник РНР
Назад Вперёд

LXXV. Перегрузка/overloading свойств и вызовов методов объектов

Предупреждение!

Это расширение является ЭКСПЕРИМЕНТАЛЬНЫМ. Поведение этого расширения, имена его функций и всё, что задокументировано, может измениться в последующих релизах РНР без предупреждения. Вы предупреждены и можете использовать это расширение только под вашу ответственность.

Это расширение предназначено для перегрузки доступа к свойствам объекта и вызовов методов. В этом расширении определена только одна функция, overload(), принимающая имя класса, в котором эта функциональность должна быть включена. Указанный класс должен определять соответствующие методы, если "хочет" иметь данную функциональность: __get(), __set() и __call(), соответственно, для получения /установки свойства или вызова метода. Этот способ перегрузки может быть избирательным. Внутри этих функций обработчика перегрузка отключена, поэтому вы можете нормально получать доступ к свойствам объекта.

Вот простые примеры использования функции overload():

Пример 1. Перегрузка PHP-класса

<?php

class OO
{
    var $a = 111;
    var $elem = array('b' => 9, 'c' => 42);

    // Callback-метод для получения свойства
    function __get($prop_name, &$prop_value)
    {
        if (isset($this->elem[$prop_name])) {
            $prop_value = $this->elem[$prop_name];
            return true;
        } else {
            return false;
        }
    }

    // Callback-метод для установки свойства
    function __set($prop_name, $prop_value)
    {
        $this->elem[$prop_name] = $prop_value;
        return true;
    }
}

// Здесь перегружаем объект OO
overload('OO');

$o = new OO;
print "\$o->a: $o->a\n"; // print: $o->a:
print "\$o->b: $o->b\n"; // print: $o->b: 9
print "\$o->c: $o->c\n"; // print: $o->c: 42
print "\$o->d: $o->d\n"; // print: $o->d:

// добавляем новый элемент в массив $elem в OO
$o->x = 56; 

// инстанциируем stdclass (он встроен в PHP 4)
// $val не перегружается!
$val = new stdclass;
$val->prop = 555;

// Устанавливает "a" как массив с объектом $val в нём
// но __set() поместит это в массив $elem
$o->a = array($val);
var_dump($o->a[0]->prop);

?>

Предупреждение!

Поскольку это экспериментальное расширение, не всё работает. Пока нет поддержки __call(), вы можете только перегружать get и set операции для свойств. Вы не можете вызывать оригинальные обработчики перегрузки класса, и __set() работает только на один уровень доступа к свойствам.

Содержание
overload - включает перегрузку свойств и вызовов методов класса

Назад Оглавление Вперёд
ob_start Вверхoverload