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