11111

ПерегрузкаПред.Глава 19. Классы и объекты (PHP 5)След.

Перегрузка

- Вызовы методов, как и обращения к свойствам объекта, могут быть перегружены с использованием методов __call, __get и __set. Эти методы будут срабатывать только в том случае, если объект или наследуемый объект не содержат свойства или метода, к которому осуществляется доступ.

Перегрузка свойств

void __set (string имя, mixed значение)

void __get (mixed имя)

- С помощью этих методов обращения к свойствам класса могут быть перегружены с целью выполнения произвольного кода, описанного в классе. В аргументе имя передаётся имя свойства, к которому производится обращение. Аргумент значение метода __set() должен содержать значение, которое будет присвоено свойству класса с именем имя.

Пример 19-18. Пример перегрузки с использование __get и __set

<?

class Setter {

public $n;

private $x = array("a" => 1, "b" => 2, "c" => 3);

function __get($nm) {

print "ЧИтаем [$nm]\n";

if (isset($this->x[$nm])) {

$r = $this->x[$nm];

print "Получили: $r\n";

return $r;

}else{

print "Ничего!\n";

}}

function __set($nm, $val) {

print "Пишем $val в [$nm]\n";

if (isset($this->x[$nm])) {

$this->x[$nm] = $val;

print "OK!\n";

}else{

print "Всё плохо!\n";

}}

}

$foo = new Setter();

$foo->n = 1;

$foo->a = 100;

$foo->a++;

$foo->z++;

var_dump($foo);

?>

- Результатом выполнения будет:

Пишем 100 в [a]

OK!

Читаем [a]

Получили: 100

Пишем 101 в [a]

OK!

Читаем [z]

Ничего!

Пишем 1 в [z]

Всё плохо!

object(Setter)#1 (2) {

["n"]=>

int(1)

["x:private"]=>

array(3) {

["a"]=>

int(101)

["b"]=>

int(2)

["c"]=>

int(3)

}}

Перегрузка методов

mixed __call (string имя, array аргументы)

- С использованием этого метода, методы класса могут быть перегружены с целью выполнения произвольного кода, описанного в классе. В аргументе имя передаётся имя вызванного метода. Аргументы, которые были переданы методу при обращении, будут возвращены чере аргументы. Значение, возвращённое методом __call(), будет передано вызывающему оператору.

Пример 19-19. Пример перегрузки с использованием __call

<?

class Caller {

private $x = array(1, 2, 3);

function __call($m, $a) {

print "Вызван метод $m :\n";

var_dump($a);

return $this->x;

}}

$foo = new Caller();

$a = $foo->test(1, "2", 3.4, true);

var_dump($a);

?>

- Результатом выполнения будет:

Вызван метод test:

array(4) {

[0]=>

int(1)

[1]=>

string(1) "2"

[2]=>

float(3.4)

[3]=>

bool(true)

}

array(3) {

[0]=>

int(1)

[1]=>

int(2)

[2]=>

int(3)

}

Пред.

Начало

След.

Интерфейсы объектов

Уровень выше

Итераторы объектов 22222

Free Web Hosting