IX. Funkce pro práci s třídami/objekty

Úvod

About

Tyto funkce vám umožňují získávat informace o třídách a instancích. Můžete zjistit název třídy do které objekt patří nebo jeho proměnné a metody. Pomocí těchto funkcí můžete zjistit nejen příslušnost objektu k třídě, ale i jeho předka (tj. kterou třídu třída tohoto objektu rozšiřuje).

Ukázka použití

V této ukázce nejdříve definujeme základní třídu a rozšíření této třídy. Základní třída popisuje obecnou zeleninu, ať už je jedlá nebo ne a bez ohledu na její barvu. Podtřída Spenat přidává metodu na uvaření této zeleniny a další, která zjistí, jestli je vařená.

Příklad 1. classes.inc

<?php

// základní třída s členskými proměnnými a metodami
class Zelenina {

    var $jedla;
    var $barva;

    function Zelenina( $jedla, $barva="green" ) {
        $this->jedla = $jedla;
        $this->barva = $barva;
    }

    function je_jedla() {
        return $this->jedla;
    }

    function jaka_barva() {
        return $this->barva;
    }

} // konec tridy zelenina

// rozsiruje zakladni tridu
class Spenat extends Zelenina {

    var $varena = false;

    function Spenat() {
        $this->Zelenina( true, "zelena" );
    }

    function cook_it() {
        $this->varena = true;
    }

    function je_varena() {
        return $this->varena;
    }

} // konec tridy Spenat

?>

Potom z těchto tříd vytvoříme 2 objekty a vytiskneme informace o nich, vč. rodičovských tříd. Také definujeme některé pomocné funkce, především kvůli pohodlnému tisku informací.

Příklad 2. test_script.php

<pre>
<?php

include "classes.inc";

// pomocné funkce

function vytiskni_promenne($obj) {
    $pole = get_object_vars($obj);
    while (list($vlastnost, $hodnota) = each($pole))
        echo "\t$vlastnost = $hodnota\n";
}

function vytiskni_metody($obj) {
    $pole = get_class_methods(get_class($obj));
    foreach ($pole as $metoda)
        echo "\tfunction $metoda()\n";
}

function class_parentage($obj, $class) {
    global $$obj;
    if (is_subclass_of($$obj, $class)) {
        echo "Objekt $obj patri do tridy ".get_class($$obj);
        echo " ktera je podtridou $class\n";
    } else {
        echo "Objekt $obj nepatri do podtridy tridy $class\n";
    }
}

// instancujeme 2 objekty

$zeleninka = new Zelenina(true,"modra");
$listnaty = new Spenat();

// vytisknout informace o obou objektech
echo "zeleninka: CLASS ".get_class($zeleninka)."\n";
echo "listnaty: CLASS ".get_class($listnaty);
echo ", PARENT ".get_parent_class($listnaty)."\n";

// vytisknout vlastnosti zeleninky
echo "\nzeleninka: Vlastnosti\n";
print_vars($zeleninka);

// a metody objektu listnaty
echo "\nlistnaty: Metody\n";
print_methods($listnaty);

echo "\nRodic:\n";
class_parentage("listnaty", "Spenat");
class_parentage("listnaty", "Zelenina");
?>
</pre>

Je třeba poznamenat, že ve výše uvedené ukázce je objekt $listnaty instancí třídy Spenat, která je podtřídou třídy Zelenina, a poslední část výše uvedeného skriptu tudíž vytiskne:

[...]
Rodic:
Objekt listnaty nepatri do podtridy tridy Spenat
Object listnaty patri do tridy Spenat, ktera je podtridou tridy Zelenina

Obsah
call_user_method_array --  Call a user method given with an array of parameters [deprecated]
call_user_method --  Zavolat uživatelsky definouvanou metodu určitého objektu
class_exists -- Zjistit, jestli je třída definována
get_class_methods -- Vrátit pole názvů metod třídy
get_class_vars -- Vrátit pole defaultních vlastností třídy
get_class -- Vrátit jméno třídy objektu
get_declared_classes -- Vrátit pole názvů definovaných tříd
get_object_vars -- Vrátit asociativní pole vlastností objektu
get_parent_class -- Vrátit název rodičovské třídy objektu
is_a --  Returns TRUE if the object is of this class or has this class as one of its parents
is_subclass_of --  Zjistit, jestli objekt patří do podtřídy určité třídy
method_exists -- Zjistit, jestli má třída určitou metodu