Хакерский форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Хакерский форум » PHP » PHP - ОО Программирование (Перегрузка).


PHP - ОО Программирование (Перегрузка).

Сообщений 1 страница 2 из 2

1

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

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

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

void __get ( mixed имя )

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

Пример перегрузки с использование __get и __set:

Код:
<?php
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)
  }
}

0

2

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

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

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

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

Код:
<?php
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)
}

0


Вы здесь » Хакерский форум » PHP » PHP - ОО Программирование (Перегрузка).