Примеры

В приведённом ниже примере, мы сначала определим базовый класс и класс его наследующий. Базовый класс описывает овощ: съедобен ли он и какого цвета. Дочерний класс Spinach добавляет метод приготовления овоща и проверки, был ли он уже приготовлен.

Пример #1 classes.inc

<?php

// базовый класс с основными свойствами и методами
class Vegetable {

    var 
$edible;
    var 
$color;

    function 
__construct($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 
__construct()
    {
        
parent::__construct(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($GLOBALS[$obj]);
        echo 
" подкласс класса $class\n";
    } else {
        echo 
"Объект $obj более не является подклассом $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);

echo 
"\nParentage:\n";
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

add a note add a note

User Contributed Notes 1 note

up
-1
denisn1 at free dot fr
1 month ago
In order to avoid an "Undefined variable" error, the class_parentage fucntion should have the global $$obj stattement :

function class_parentage($obj, $class) {
    global $$obj;
    if (is_subclass_of($GLOBALS[$obj], $class)) {
        echo "L'objet $obj appartient à la classe " . get_class($$obj);
        echo " une sous-classe de $class\n";
    } else {
        echo "L'object $obj n'appartient pas à une sous-classe $class\n";
    }
}
To Top