Перегрузка свойств и вызовов методов объектов
Предупреждение! |
---|
Это расширение является ЭКСПЕРИМЕНТАЛЬНЫМ. Поведение этого расширения, имена его функций и всё, что задокументировано, может измениться в последующих релизах РНР без предупреждения. Вы предупреждены и можете использовать это расширение только под вашу ответственность.
|
Это расширение предназначено для перегрузки доступа к свойствам объекта и
вызовов методов. В этом расширении определена только одна функция,
overload(), принимающая имя класса, в котором эта функциональность должна быть включена.
Указанный класс должен определять соответствующие методы, если "хочет" иметь
данную функциональность: __get(), __set() и __call(), соответственно, для получения /установки свойства или вызова метода.
Этот способ перегрузки может быть избирательным. Внутри этих функций
обработчика перегрузка отключена, поэтому вы можете нормально получать доступ к свойствам объекта.
Вот простые примеры использования функции overload():
Пример 1. Перегрузка PHP-класса
<?php
class OO {
var $a = 111;
var $elem = array('b' => 9, 'c' => 42);
// Callback method for getting a property
function __get($prop_name, &$prop_value)
{
if (isset($this->elem[$prop_name])) {
$prop_value = $this->elem[$prop_name];
return true;
} else {
return false;
}
}
// Callback method for setting a property
function __set($prop_name, $prop_value)
{
$this->elem[$prop_name] = $prop_value;
return true;
}
}
// Here we overload the OO object
overload('OO');
$o = new OO;
echo "\$o->a: $o->a\n"; // print: $o->a: 111
echo "\$o->b: $o->b\n"; // print: $o->b: 9
echo "\$o->c: $o->c\n"; // print: $o->c: 42
echo "\$o->d: $o->d\n"; // print: $o->d:
// add a new item to the $elem array in OO
$o->x = 56;
// instantiate stdclass (it is built-in in PHP 4)
// $val is not overloaded!
$val = new stdclass;
$val->prop = 555;
// Set "a" to be an array with the $val object in it
// But __set() will put this in the $elem array
$o->a = array($val);
var_dump($o->a[0]->prop);
?> |
|
Предупреждение! |
---|
Поскольку это экспериментальное расширение, не всё работает. Пока нет поддержки __call(), вы можете только перегружать get и set операции для свойств. Вы не можете
вызывать оригинальные обработчики перегрузки класса, и __set() работает только на один уровень доступа к свойствам.
| - Содержание
- overload - включает перегрузку свойств и вызовов методов класса
|