Введение в PHP5 - Абстрактные классы

ОГЛАВЛЕНИЕ

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

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

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

Пример 6: Абстрактные классы

<?php
abstract class foo {
  protected 
$x;

  abstract function 
display();

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


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

__call

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

 

Пример 7: __call

<?php
class foo {

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

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

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

Пример 8: Перегрузка методов с помощью __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");
?>