IX. Klasy/Obiekty

Wprowadzenie

Te funkcje pozwalają uzyskać informacje o klasach i ich egzemplarzach, obiektach. Możesz uzyskać informację o nazwie klasy do jakiej należy obiekt, a także jej właściwości i metody. Używając tych funkcji możesz dowiedzieć się nie tylko do jakiej klasy należy obiekt, ale także ustalić jego przodków (np. jaką klasę rozszerza klasa tego obiektu).

Przykłady

W tym przykładzie najpierw zdefiniujemy bazową klasę i jej rozszerzenie. Klasa bazowa opisuje normalne warzywo, czy jest jadalne czy nie oraz jego kolor. Podklasa Szpinak dodaje metodę pozwalającą go zagotować i drugą, która pozwala dowiedzieć się, czy jest zagotowany.

Przykład 1. classes.inc

<?php

// klasa bazowa wraz z jej właściwościami i metodami
class Warzywo {

    var
$jadalne;
    var
$kolor;

    function
Warzywo( $jadalne, $kolor="zielony" ) {
        
$this->jadalne = $jadalne;
        
$this->kolor = $kolor;
    }

    function
jest_jadalne() {
        return
$this->jadalne;
    }

    function
jaki_kolor() {
        return
$this->kolor;
    }

}
// koniec klasy Warzywo

// rozrzesza klasę bazową
class Szpinak extends Warzywo {

    var
$ugotowane = false;

    function
Szpinak() {
        
$this->Warzywo( true, "zielone" );
    }

    function
ugotuj() {
        
$this->ugotowane = true;
    }

    function
jest_ugotowane() {
        return
$this->ugotowane;
    }

}
// koniec klasy Szpinak

?>

Teraz możemy stworzyć dwa egzemplarze tych klas i wydrukować informacje o nich, włączając w to informacje o przodkach. Zdefiniujemy także kilka użytecznych funkcji, głównie po to by uzyskać ładny wydruk zmiennych.

Przykład 2. test_script.php

<pre>
<?php

include "classes.inc";

// funkcje użytkowe

function drukuj_wlasciwosci($obj) {
    
$tab = get_object_vars($obj);
    while (list(
$wlasc, $wart) = each($tab))
        echo
"\t$wlasc = $wart\n";
}

function
drukuj_metody($obj) {
    
$tab = get_class_methods(get_class($obj));
    foreach (
$tab as $metoda)
        echo
"\tfunkcja $metoda()\n";
}

function
przodkowie_klasy($obj, $klasa) {
    global $
$obj;
    if (
is_subclass_of($$obj, $klasa)) {
        echo
"Obiekt $obj należy do klasy ".get_class($$obj);
        echo
", podklasy $klass\n";
    } else {
        echo
"Obiekt $obj nie należy do podklasy $klass\n";
    }
}

// tworzymy 2 egzemplarze obiektów

$warzywko = new Warzywo(true,"niebieski");
$lisciaste = new Szpinak();

// wydrukujemy informację o obiektach
echo "warzywko: KLASA ".get_class($warzywko)."\n";
echo
"lisciaste: KLASA ".get_class($lisciaste);
echo
", PRZODEK ".get_parent_class($lisciaste)."\n";

// pokażym właściwości warzywka
echo "\nwarzywko: Właściwości\n";
drukuj_wlasciwosci($warzywko);

// i metody liściastego
echo "\nlisciaste: Metody\n";
drukuj_metody($lisciaste);

echo
"\nPrzodkowie:\n";
przodkowie_klasy("lisciaste", "Szpinak");
przodkowie_klasy("lisciaste", "Warzywo");
?>
</pre>

Wartą odnotowania rzeczą w powyższym przykładzie jest to, że obiekt $lisciaste jest egzemplarzem klasy Szpinak która to jest podklasą klasy Warzywo, i tak ostatnia część powyższego skryptu pokaże na wyjściu:

[...]
Przodkowie:
Obiekt lisciasty nie należy do podklasy Szpinak
Obiekt lisciasty należy do klasy Szpinak, podklasy Warzywo

Spis treści
call_user_method_array --  Wywołuje metodę użytkownika zadaną z tablicą parametrów [przestarzałe]
call_user_method --  Wywołuje metodę użytkownika na zadanym obiekcie [przestarzałe]
class_exists -- Sprawdza czy klasa została zdefiniowana
get_class_methods -- Zwraca tablicę nazw metod danej klasy
get_class_vars --  Zwraca tablicę domyślnych właściwości klasy
get_class -- Zwraca nazwę klasy zadanego obiektu
get_declared_classes -- Zwraca tablicę z nazwami zdefiniowanych klas
get_object_vars -- Zwraca tablicę asocjacyjną właściwości obiektu
get_parent_class -- Pobiera nazwę klasy przodka obiektu bądź klasy
is_a --  Zwraca TRUE jeżeli obiekt jest tej klasy, lub ta klasa jest jednym z jego przodków
is_subclass_of --  Zwraca TRUE jeżeli klasa jest jednym z przodków obiektu
method_exists -- Sprawdza czy istnieje metoda dla klasy