Objekty v PHP 5 - 6. díl

Tato část pojednává o porovnávání objektů, o typování parametrů funkcí a o automatickém nahrávání.

Porovnávání objektů

V PHP verze 5 je porovnávání objektů mnohem komplikovanější, než v PHP verze 4.

Když je použit porovnávací operátor == (2 rovnítka vedle sebe), objektové proměnné jsou velmi jednoduše porovnávány. A to tak, že objekty jsou považovány za stejné, pokud mají stejné atributy a jejich hodnoty a zároveň jsou instancemi stejné třídy.

Když je použit operátor pro zjištění identity === (3 rovnítka vedle sebe), objektové proměnné jsou považovány za identické, když odkazují na stejnou instanci stejné třídy.

Pro otestování porovnání můžeme zkusit třeba následující skript:

<?php
class pokus_1
{
  public $a = 10;
}
 
class pokus_2
{
  public $a = 10;
}
 
$o = new pokus_1;
$p = new pokus_1;
$q = $o;
$r = new pokus_2;
 
echo `o == p: `; var_dump($o == $p);
echo `o === p: `; var_dump($o === $p);
echo `o == q: `; var_dump($o == $q);
echo `o === q: `; var_dump($o === $q);
echo `o == r: `; var_dump($o == $r);
echo `o === r: `; var_dump($o === $r);
?>

Výše uvedený skript vypíše tento výsledek:

o == p: bool(true)
o === p: bool(false)
o == q: bool(true)
o === q: bool(true)
o == r: bool(false)
o === r: bool(false)

Objektové typy jako parametry funkcí

PHP 5 jde ještě dále v používání objektů, a to tak, že je možné u funkcí naznačit, jaký typ objektu smí mít daný parametr. Jde to jednoduše použitím jména třídy před parametrem. Dobře je to vidět na příkladu:

<?php
class trida_1
{
  public function test(trida_2 $o)
  {
    echo $o->zprava;
  }
}
 
class trida_2
{
  public $zprava = `ahoj`;
}
 
$objekt_1 = new trida_1;
$objekt_2 = new trida_2;
 
$objekt_1->test($objekt_2);
?>

U výše uvedeného skriptu je dobře vidět, že metoda test v definici trida_1 musí mít parametr typu trida_2. Pokud bych při zavolání metody test předal cokoli jiného, než objekt typu trida_2, dostanu při pokusu spustit takový skript hlášení typu fatal error.

Takové upřesnění typu parametru u funkce se může hodit, protože tato vlastnost chyběla v PHP verze 4. Dobré je, že chyby v předání jiného typu, než jste očekávali se zachytí už ve fázi parsování skriptu. Můžeme se tak vyhnout mnoha závažným a těžko hledatelným chybám.

Automatické nahrávání

Pokud máte každou třídu definovanou ve zvláštním souboru, může pro vás být funkce automatického nahrávání hotové požehnání.

Pokud se pokusíte použít třídu, kterou ještě nemáte definovanou, PHP se pokusí zavolat funkci s názvem __autoload. V této funkci můžete mít cokoli, nejlépe vložení souboru s definicí třídy. Takový jednoduchý příklad je zde:

<?php
function __autoload($jmeno_tridy)
{
  require_once($jmeno_tridy.`.inc.php`);
}
 
$objekt_1 = new trida_1;
$objekt_2 = new trida_2;
?>

Funkce __autoload pracuje stejně dobře jak pro třídy, tak i pro rozhraní. Jakmile se pokusíte použít někde nějakou třídu, nebo rozhraní, které PHP ještě nezná, automaticky zavolá funkci __autoload.

Diskuze (5) Další článek: Trh internetové reklamy v letošním roce - miliarda

Témata článku: , , , , , , , , , , ,