PHP программирование → Переход от php4 к php5 ( Абстрактные классы. __set и __get)
Начало:
http://php5.com.ua/blog/php-programming/133.html
http://php5.com.ua/blog/php-programming/134.html
Абстрактным называется класс, который может использоваться только как базовый (то есть создавать объекты этого класса нельзя). Как и в любом нормальном базовом классе, в абстрактном классе вы можете определять методы и переменные.
В абстрактном классе также можно определять абстрактные методы: методы, которые не реализованы в абстрактном классе, но которые обязательно должны быть реализованы в производных классах.
Пример: Абстрактные классы
С PHP5 вы можете реализовать в классе специальный метод __call(), как метод для «отлова» всех нереализованных в данном классе методов. Метод __call (если он определён) вызывается при попытке вызвать недоступный или несуществующий метод.
Пример: __call
Этот специальный метод может быть использован для реализации перегрузки методов: вы можете исследовать полученные аргументы и в зависимости от результата вызвать подходящий для данного случая закрытый метод, например:
Пример: Перегрузка методов с помощью __call
Но это ещё не всё, теперь вы можете определить методы __set и __get для «отлова» всех попыток изменения или доступа к неопределённым (или недоступным) переменным.
Пример: __set и __get
В PHP5 вы сможете «сказать» методу, что он должен получить в качестве аргумента объект определённого типа.
Пример: указание типов
Как вы заметили, перед именем аргумента теперь можно поставить имя его класса, и таким образом PHP5 определит, что переменная $foo должна быть класса foo.
Продолжение:
http://php5.com.ua/blog/php-programming/146.html
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() {
// Код
}
}
?>
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();
?>
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");
?>
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);
?>
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);
?>
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



