Forum und email
Klasy/Obiekty

XII. Klasy/Obiekty

Wstęp

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

Wymagania

Do zbudowania tego rozszerzenia nie są wymagane żadne zewnętrzne biblioteki.

Instalacja

By używać tych funkcji, nie trzeba niczego instalować. Są one częścią jądra PHP.

Konfiguracja uruchomieniowa

To rozszerzenie nie definiuje posiada żadnych dyrektyw konfiguracyjnych w pliku php.ini.

Typy zasobów

To rozszerzenie nie posiada żadnych rodzajów zasobów.

Stałe predefiniowane

To rozszerzenie nie posiada żadnych stałych.

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
czy_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
czy_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) {
    foreach (
get_object_vars($obj) as $wlasc => $wart) {
        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($GLOBALS[$obj], $klasa)) {
        echo
"Obiekt $obj należy do klasy ".get_class($$obj);
        echo
", podklasy $klasa\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żmy 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_declared_interfaces -- Returns an array of all declared interfaces
get_object_vars -- Zwraca tablicÄ™ asocjacyjnÄ… wÅ‚aÅ›ciwoÅ›ci obiektu
get_parent_class -- Pobiera nazwÄ™ klasy przodka dla obiektu lub klasy
interface_exists -- Checks if the interface has been defined
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 metoda klasy istnieje
property_exists --  Checks if the object or class has a property