→

PHP программирование →  Переход от php4 к php5 ( Абстрактные классы. __set и __get)

Начало:
http://php5.com.ua/blog/php-programming/133.html
http://php5.com.ua/blog/php-programming/134.html

Абстрактные классы


Абстрактным называется класс, который может использоваться только как базовый (то есть создавать объекты этого класса нельзя). Как и в любом нормальном базовом классе, в абстрактном классе вы можете определять методы и переменные.

В абстрактном классе также можно определять абстрактные методы: методы, которые не реализованы в абстрактном классе, но которые обязательно должны быть реализованы в производных классах.

Пример: Абстрактные классы
<?php
abstract class foo {
  protected $x;

  abstract function display();

  function setX($x) {
    $this->x = $x;
  }
}


class foo2 extends foo {
  function display() {
    // Код
  }
}
?>

__call

С PHP5 вы можете реализовать в классе специальный метод __call(), как метод для «отлова» всех нереализованных в данном классе методов. Метод __call (если он определён) вызывается при попытке вызвать недоступный или несуществующий метод.

Пример: __call
<?php
class foo {

  function __call($name,$arguments) {
    print("Вызывали? Я -  $name!");
  }
}

$x = new foo();
$x->doStuff();
$x->fancy_stuff();
?>

Этот специальный метод может быть использован для реализации перегрузки методов: вы можете исследовать полученные аргументы и в зависимости от результата вызвать подходящий для данного случая закрытый метод, например:

Пример: Перегрузка методов с помощью __call
<?php
class Magic {

  function __call($name,$arguments) {
    if($name=='foo') {
      if(is_int($arguments[0])) $this->foo_for_int($arguments[0]);
      if(is_string($arguments[0])) $this->foo_for_string($arguments[0]);
    }
  }

  private function foo_for_int($x) {
    print("у, смотрите, целое число!");
  }

  private function foo_for_string($x) {
    print("у, смотрите, строка!");
  }
}

$x = new Magic();
$x->foo(3);
$x->foo("3");
?>

__set и __get


Но это ещё не всё, теперь вы можете определить методы __set и __get для «отлова» всех попыток изменения или доступа к неопределённым (или недоступным) переменным.

Пример: __set и __get
<?php
class foo {

  function __set($name,$val) {
    print("Привет, вы попытались присвоить значение $val переменной $name");
  }

  function __get($name) {
    print("Привет, вы пытались обратиться к $name");
  }
}

$x = new foo();
$x->bar = 3;
print($x->winky_winky);
?>

В PHP5 вы сможете «сказать» методу, что он должен получить в качестве аргумента объект определённого типа.

Пример: указание типов
<?php
class foo {
  // код ...
}

class bar {
  public function process_a_foo(foo $foo) {
   // Ещё какой-нибудь код
  }
}

$b = new bar();
$f = new foo();
$b->process_a_foo($f);
?>

Как вы заметили, перед именем аргумента теперь можно поставить имя его класса, и таким образом PHP5 определит, что переменная $foo должна быть класса foo.

Продолжение:
http://php5.com.ua/blog/php-programming/146.html
2