Эти функции позволяют получать информацию о классах и инстанциировать
(создавать экземпляры) объекты. Вы можете получить имя класса, к которому
принадлежит объект, а также свойства и методы члена класса. Используя эти
функции, вы можете определить не только членство объекта в классе, но и
наследование (т.е. - какой класс расширяется классом объекта).
В первом примере мы сначала определяем базовый класс и расширение этого
класса. Базовый класс описывает овощ/vegetable в целом: съедобен ли он и какого цвета. Подкласс
Spinach добавляет метод для приготовления его и метод для определения, готов ли он.
Пример 1. classes.inc
<?php
// базовый класс со свойствами и методами членов
class Vegetable {
var $edible;
var $color;
function Vegetable( $edible, $color="green" ) {
$this->edible = $edible;
$this->color = $color;
}
function is_edible() {
return $this->edible;
}
function what_color() {
return $this->color;
}
} // конец определения класса Vegetable
// конец базового класса
class Spinach extends Vegetable {
var $cooked = false;
function Spinach() {
$this->Vegetable( true, "green" );
}
function cook_it() {
$this->cooked = true;
}
function is_cooked() {
return $this->cooked;
}
} // конец класса Spinach
?>
Затем мы инстанциируем 2 объекта этих классов и печатаем информацию о них,
включая их иерархию классов. Мы также определяем некоторые вспомогательные функции, в основном для
нормальной печати переменных.
Пример 2. test_script.php
<pre>
<?php
include "classes.inc";
// вспомогательные функции
function print_vars($obj) {
$arr = get_object_vars($obj);
while (list($prop, $val) = each($arr))
echo " $prop = $val
";
}
function print_methods($obj) {
$arr = get_class_methods(get_class($obj));
foreach ($arr as $method)
echo " function $method()
";
}
function class_parentage($obj, $class) {
global $$obj;
if (is_subclass_of($$obj, $class)) {
echo "Object $obj belongs to class ".get_class($$obj);
echo " a subclass of $class
";
} else {
echo "Object $obj does not belong to a subclass of $class
";
}
}
// инстанциируем (создаём) 2 объекта
$veggie = new Vegetable(true,"blue");
$leafy = new Spinach();
// печатаем информацию об объектах
echo "veggie: CLASS ".get_class($veggie)."
";
echo "leafy: CLASS ".get_class($leafy);
echo ", PARENT ".get_parent_class($leafy)."
";
// показываем свойства veggie
echo "
veggie: Properties
";
print_vars($veggie);
// и методы leafy
echo "
leafy: Methods
";
print_methods($leafy);
echo "
Parentage:
";
class_parentage("leafy", "Spinach");
class_parentage("leafy", "Vegetable");
?>
</pre>
В этом примере важно отметить, что объект
$leafy является экземпляром класса Spinach, который является подклассом от
Vegetable, следовательно, последняя часть вышеприведённого скрипта выведет:
[...]
Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach a subclass of Vegetable
Содержание
call_user_method_array - вызывает пользовательский метод, заданный с массивом параметров [не рекомендуется применять]
call_user_method - вызывает пользовательский метод в специфическом объекте [не рекомендуется применять]
class_exists - проверяет, определён ли данный класс