Poglavje 13. Razredi in objekti

Kazalo
razred
extends
Konstruktorji
::
parent
Serializacija objektov - objekti in seje
Posebne funkcije __sleep in __wakeup
Reference znotraj konstruktorja

razred

Razred je zbirka spremenljivk in funkcij, ki delajo s temi spremenljivkami. Razred definiramo z naslednjo sintakso:

<?php
class Cart
{
    var
$items;  // Predmeti v vozicku
   
    // Dodaj $num predmetov z stevilko artikla $artnr

    
function add_item ($artnr, $num)
    {
        
$this->items[$artnr] += $num;
    }
   
    
// Vzemi $num predmetov iz vozicka ki imajo stevilko artikla $artnr

    
function remove_item ($artnr, $num)
    {
        if (
$this->items[$artnr] > $num) {
            
$this->items[$artnr] -= $num;
            return
true;
        } else {
            return
false;
        }   
    }
}
?>

Zgornje definira razred z imenom Cart, ki ga sestavlja asociativna tabela artiklov in dve funkciji za dodajanje in odstranjevanje predmetov.

Opozorilo

Naslednja opozorila so veljavna za PHP 4.

Ime stdClass uporablja Zend interno in je zato zasedeno. Uporaba razreda, ki ima ime stdClass, v PHP-ju ni možna.

Funkciji __sleep in __wakeup sta posebni funkciji v PHP razredih. Funkcije s tem imenom ne morate imeti v vaših razredih, razen če bi radi uporabili njuno posebno funkcionalnost. Spodaj se nahaja več informacij.

PHP si je rezerviral vse funkcije ki se pričnejo z __ kot posebne. Priporočljivo je, da ne uporabljate funkcij z __ razen če bi radi uporabili kak&353;o od dokumentiranih funkcionalnosti.

Opomba: V PHP 4 so dovoljeni samo initializatorji konstant var. Da bi inicializirali spremenljivko z ne-konstantno vrednostjo, morate imeti inicializacijsko fukcijo, ki je klicana avtomatično, ko kreiramo objekt iz razreda. Taka funkcija se imenuje konstruktor (poglejte spodaj).

<?php
/* Nic od tega ne bo delalo v PHP 4. */
class Cart
{
    var
$todays_date = date("Y-m-d");
    var
$name = $firstname;
    var
$owner = 'Fred ' . 'Jones';
    var
$items = array("VCR", "TV");
}

/* To je pravilen postopek. */
class Cart
{
    var
$todays_date;
    var
$name;
    var
$owner;
    var
$items;

    function
Cart()
    {
        
$this->todays_date = date("Y-m-d");
        
$this->name = $GLOBALS['firstname'];
        
/* itd. . . */
    
}
}
?>

Razredi so tipi, ubistvu so načrti za dejanske spremenljivke. Vi morate ustvariti spremenljivko željenega tipa z operatorjem new.

<?php
$cart
= new Cart;
$cart->add_item("10", 1);

$another_cart = new Cart;
$another_cart->add_item("0815", 3);

To ustvari objekta $cart in $another_cart, oba razreda Cart. Funkcija add_item() $cart objekta je klicana za dodajanje enega predmeta, ki ima številko artikla 10, v objektu $cart. Trije predmeti, ki imajo številko artikla 0815 so dodani v $another_cart.

Oba objekta, $cart in $another_cart imata funkciji add_item(), remove_item() in spremenljivke. To so različne funkcije in spremenljivke. Objekte si lahko predstavljate kot direktorije v datotečnem sistemu. V datotečnem sistemu imate lahko dve različni datoteki README.TXT dokler sta ti dve datoteki vsaka v svojem direktoriju. Tako kot pri direktorijih, kjer morate vpisati celotno pot iz vrhovnega direktorija, morate tu uporabiti celotno ime funkcije, ki jo želite klicati. V PHP-ju bi bil vrhovni direktorij globalni imenski prostor in ločilec za direktorije ->. Tako so imena $var->items in $another_cart->items imena za dve različni spremenljivki. Zapomnite si da je spremenljivka imenovana $cart->items in ne $cart->$items. To pomeni, da ima spremenljivka v PHP-ju samo en dolar znak.

// pravilno, enojni $
$cart->items = array("10" => 1);

// napacno, ker $cart->$items postane $cart->""
$cart->$items = array("10" => 1);

// pravilno, ce je to kar ste zeleli:
// $cart->$myvar postane $cart->items
$myvar = 'items';
$cart->$myvar = array("10" => 1);

V definiciji razreda nevemo pod kaksnim imenom bo objekt dostopen v našem programu: v trenutku, ko smo pisali razred Cart, ime objekta $cart ali $another_cart ni bilo zmano. Torej ne morate pisati $cart->items v samem Cart razredu. Namesto tega, če želimo dostopati do funkcij in spremenljivk razreda v razredu samem, uporabimo izmišljeno spremenljivko $this, ki si jo lahko predstavljamo kot 'moje' ali 'trenutni objekt'. Torej bi '$this->items[$artnr] += $num' lahko prebrali kot 'dodaj $num k $artnr števcu v moji tabeli predmetov' ali 'dodaj $num k $artnr števcu v tabeli predmetov v trenutnem objektu'.

Opomba: Obstaja kar nekaj zanimivh funkcij za upravljanje razredov in objektov. Oglejte si Razredne/Objektne Funkcije