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 — Zavolat u╛ivatelsky definouvanou metodu urΦitΘho objektu
class_exists — Zjistit, jestli je t°φda definovßna
get_class — Vrßtit jmΘno t°φdy objektu
get_class_methods — Vrßtit pole nßzv∙ metod t°φdy
get_class_vars — Vrßtit pole defaultnφch vlastnostφ t°φdy
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_subclass_of — Zjistit, jestli objekt pat°φ do podt°φdy urΦitΘ t°φdy
method_exists — Zjistit, jestli mß t°φda urΦitou metodu