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

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

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)
}

В PHP V5.3 добавлен новый магический метод: __callStatic(). Он работает аналогично магическому методу __call(), предназначенному для управления вызовами методов, которые не определены или не видимы в классе. Однако __callStatic() применяется для управления вызовами статических методов, что позволяет нам лучше проектировать перегрузку своего метода. Ниже приводится пример использования этого метода.

Пример: сравнение методов __callStatic() и __call()

  class Foo { public static function __callStatic( $name, $args ) { echo "Called method $name statically"; }   public function __call( $name, $args ) { echo "Called method $name"; } }   Foo::dog(); // выводит "Called method dog statically" $foo = new Foo; $foo->dog(); // выводит "Called method dog"

Надо отметить, что в РНР определение метода __callStatic() строго регламентируется; он должен быть публичным и определенным как статический. Аналогично, магический метод __call(), как и все магические методы, тоже должен быть определен как публичный.

Функции для работы с классами и объектами

В РНР существует несколько стандартных функций для работы с классами и объектами. Рассмотрим некоторые функции для работы с классами и объектами в контексте PHP4.

get_class_methods()

Функция get_class_methods() возвращает массив имен методов класса с заданным именем. Синтаксис функции get_class_methods():

array get_class_methods (string имя_класса)

Простой пример использования get_class_methods() - Получение списка методов класса:

<?php
...
class Airplane extends Vehicle {
var $wingspan;
function setWingSpan($wingspan) {
$this->wingspan = $wingspan;
}

function getWingSpan() {
return $this->wingspan;
}
}

$cls_methods = get_class_methods(Airplane);
// Массив $cls_methods содержит имена всех методов,
// объявленных в классах "Airplane" и "Vehicle"
?>

Как видно из листинга, функция get_class_methods() позволяет легко получить информацию обо всех методах, поддерживаемых классом.

get_class_vars()

Функция get_class_vars() возвращает массив имен атрибутов класса с заданным именем. Синтаксис функции get_class_vars():

array get_class_vars (string имя_класса)

Пример использования функции get_class_vars() - получение списка атрибутов (свойств) класса:

<?php

class Vehicle {
var $model;
var $current_speed;
}

class Airplane extends Vehicle {
var $Swingspan;
}

$a_class = "Airplane";
$attribs = get_class_vars($a_class);
// $attribs = array ("wingspan", "model", "current_speed")
?>

В рассмотренном примере массив $attribs заполняется именами всех атрибутов класса Airplane.

get_object_vars()

Функция get_object_vars() возвращает ассоциативный массив с информацией обо всех атрибутах объекта с заданным именем. Синтаксис функции get_object_vars():

array get_object_vars (object имя_обьекта)

Пример использования функции get_object_vars() - получение информации о переменных объекта:

<?php

class Vehicle {
var $wheels;
}

class Land extends Vehicle {
var $engine;
}

class car extends Land {
var $doors;
function car($doors, $eng, $wheels) {
$this->doors = $doors;
$this->engine = $eng;
$this->wheels = $wheels;
}

function get_wheels() {
return $this->wheels;
}
}

$toyota = new car(2,400,4);
$vars = get_object_vars($toyota);
while (list($key, $value) = each($vars)):
print "$key ==> $value <br>";
endwhile;
// Выходные данные:
// wheels ==> 4
// engine ==> 400
// doors ==> 2

?>

Функция get_object_vars() позволяет быстро получить всю информацию об атрибутах конкретного объекта и их значениях в виде ассоциативного массива.

Функция method_exists() проверяет, поддерживается ли объектом метод с заданным именем. Если метод поддерживается, функция возвращает TRUE, в противном случае возвращается FALSE. Синтаксис функции method_exists():

bool method_exi sts (object имя_обьекта. string имя_метода)

Пример использования метода method_exists() - проверка поддержки метода объектом:

<?php

class Vehicle {
//...
}

class Land extends Vehicle {
var $fourWheel;

function setFourWheelDrive() {
$this->fourWeel = 1;
}

}
// Создать объект с именем $саr
$car = new Land;
// Если метод "fourWheelDrive" поддерживается классом "Land"
// или "Vehicle", вызов method_exists возвращает TRUE;
// в противном случае возвращается FALSE.
// В данном примере method_exists() возвращает TRUE.
if (method_exists($car, "setfourWheelDrive")):
print "This car is equipped with 4-wheel drive";
else:
print "This car is not equipped with 4-wheel drive";
endif;
?>

В рассмотренном примере функция method_exists() проверяет, поддерживается ли объектом $car метод с именем setFourWheelDrive(). Если метод поддерживается, функция возвращает логическую истину и фрагмент выводит соответствующее сообщение. В противном случае возвращается FALSE и выводится другое сообщение.

get_class()

Функция get_class() возвращает имя класса, к которому относится объект с заданным именем. Синтаксис функции get_class():

string get_class(object имя_объекта);

Пример использования get_class() - получение имени класса:

<?php

class Vehicle {
}

class Land extends Vehicle {
}

// Создаем объект с именем $саr:
$car = new Land;
// Переменной $class_a присваивается строка "Land":
$class_a = get_class($car);
echo $class_a;
?>

В рассмотренном примере переменной $class_a присваивается имя класса, на основе которого был создан объект $саr.

get_parent_class()

Функция get_parent_class() возвращает имя родительского класса (если он есть) для объекта с заданным именем. Синтаксис функции get_parent_dass():

string get_parent_class (object имя_обьекта);

Пример получения имени родительского класса функцией get_parent_class():

<?php

class Vehicle {
//...
}

class Land extends Vehicle {
//...
}

// Создаем объект с именем $саr:
$саr = new Land;
// Переменной $parent присваивается строка "Vehicle":
$parent = get_parent_class($car);
?>

При вызове get_parent_class() переменной $parent будет присвоена строка "Vehicle".

is_subclass_of()

Функция is_subclass_of() проверяет, был ли объект создан на базе класса, имеющего родительский класс с заданным именем. Функция возвращает TRUE, если проверка дает положительный результат, и FALSE в противном случае. Синтаксис функции is_subclass_of():

bool is_subclass_of (object объект, string имя_класса)

Пример использования функции is_subdass_of():

<?php

class Vehicle {
//...
}

class Land extends Vehicle {
//...
}
$auto = new Land;
// Переменной $is_subclass присваивается TRUE
$is_subclass = is_subclass_of($auto, "Vehicle");
?>

В рассмотренном примере переменной $is_subclass() присваивается признак того, принадлежит ли объект $auto к субклассу родительского класса Vehicle. В приведенном фрагменте $auto относится к классу Vehicle; следовательно $is_subclass() будет присвоено значение TRUE.

get_declared_classes()

Функция get_declared_classes() возвращает массив с именами всех определенных классов. Синтаксис функции get_declared_classes():

array get_declared_classes()

Пример получения списка классов функцией get_declared_classes():

<?php

class Vehicle {
//...
}

class Land extends Vehicle {
//...
}

$declared_classes = get_declared_classes();
// $declared_classes = array("Vehicle", "Land")
?>

Для ознакомления с полным перечнем таких функций обратитесь к справочнику функций PHP.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: