Forum und email
Funkce pro práci s třídami/objekty

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

Úvod

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).

Požadavky

Tyto funkce jsou k dispozici jako součást standardního modulu, který je vždy dostupný.

Instalace

K používání těchto funkcí není třeba žádná instalace, jsou součástí jádra PHP.

Konfigurace běhu

Toto rozšíření nemá definováno žádné konfigurační direktivy.

Typy prostředků

Toto rozšíření nemá definován žádný typ prostředku (resource).

Předdefinované konstanty

Toto rozšíření nemá definovány žádné konstanty.

Příklady

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 třídy Zelenina

// rozšiřuje základní třídu
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 třídy 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) {
    if (
is_subclass_of($GLOBALS[$obj], $class)) {
        echo
"Objekt $obj patří do třídy ".get_class($$obj);
        echo
", která je podtřídou $class\n";
    } else {
        echo
"Objekt $obj nepatří do podtřídy třídy $class\n";
    }
}

// instancujeme 2 objekty

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

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

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

// a metody objektu listnatý
echo "\nlistnatý: Metody\n";
vytiskni_metody($listnaty);

echo
"\nRodič:\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:

[...]
Rodič:
Objekt listnaty nepatří do podtřídy třídy Spenat
Object listnaty patří do třídy Spenat, která je podtřídou 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_declared_interfaces -- Returns an array of all declared interfaces
get_object_vars -- Vrátit asociativní pole vlastností objektu
get_parent_class -- Vrátit název rodičovské třídy objektu
interface_exists -- Checks if the interface has been defined
is_a -- Checks 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
property_exists --  Checks if the object or class has a property