Нижеописанные функции позволят вам получить информацию о классах
и экземплярах объектов. Вы можете получить имя класса из экземпляра
объекта равно как и все его свойства и методы. Используя эти
функции, вы сможете установить не только принадлежность объекта
к конкретному классу, но и определить наследование (к примеру какой
класс наследует класс данного объекта).
В приведённом ниже примере, мы сначала определим базовый класс
и класс его наследующий. Базовый класс описывает овощ: съедобен
ли и какого внешне цвета. Дочерний класс Spinach
добавляет метод приготовления овоща и проверки -- был ли он уже
приготовлен.
Пример 1. classes.inc
<?php
// базовый класс с основными свойствами и методами class 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. test_script.php
<pre> <?php
include "classes.inc";
// функции-утилиты
function print_vars($obj) { $arr = get_object_vars($obj); while (list($prop, $val) = each($arr)) echo "\t$prop = $val\n"; }
function print_methods($obj) { $arr = get_class_methods(get_class($obj)); foreach ($arr as $method) echo "\tfunction $method()\n"; }
function class_parentage($obj, $class) { if (is_subclass_of($GLOBALS[$obj], $class)) { echo "Object $obj belongs to class " . get_class($$obj); echo " a subclass of $class\n"; } else { echo "Object $obj does not belong to a subclass of $class\n"; } }
// создание экземпляров объектов
$veggie = new Vegetable(true, "blue"); $leafy = new Spinach();
// распечатка информации об объектах echo "veggie: CLASS " . get_class($veggie) . "\n"; echo "leafy: CLASS " . get_class($leafy); echo ", PARENT " . get_parent_class($leafy) . "\n";
// показать свойства объекта класса Spinach echo "\nveggie: Properties\n"; print_vars($veggie);
// и методы объекта базового класса Vegetable echo "\nleafy: Methods\n"; print_methods($leafy);
Важно заметить, что в приведенном выше примере объект
$leafy -- экземпляр класса
Spinach, который наследует класс
Vegetable,
вследствие чего последний пункт скрипта выведет:
[...]
Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach a subclass of Vegetable