|
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 - включает перегрузку свойств и вызовов методов класса
|
|