Objekty v PHP 5 - 4. díl

V dnešním dílu našeho programátorského seriálu si povíme více o iteracích přes datové členy, a o metodách __toString, __sleep a __wakeup.

Iterace přes datové členy

V PHP 5 můžeme použít konstrukci foreach pro iteraci přes všechny viditelné datové členy. Nejlépe bude použití konstrukce foreach ukázat rovnou na příkladu:

<?php
class pokus
{
  public $a1 = `hodnota1`;
  public $a2 = `hodnota2`;
  protected $prot = `hodnota3`;
  private $priv = `hodnota4`;
 
  function VypisData()
  {
    echo "Funkce VypisData<br>\n";
    foreach ($this as $klic => $hodnota)
      echo "$klic => $hodnota<br>\n";
  }
}
 
$objekt = new pokus;
$objekt->VypisData();
 
echo "Přímý výpis<br>\n";
foreach ($objekt as $klic => $hodnota)
  echo "$klic => $hodnota<br>\n";
?>

Výše uvedený příklad používá konstrukci foreach dvakrát, aby demonstroval, že pokaždé se vypíší všechny viditelné členy. Pokud se použije konstrukce foreach schovaná uvnitř metody VypisData, vypíší se všechny datové členy, protože pro metody třídy jsou všechny datové členy viditelné. Pokud se použije konstrukce foreach umístěná přímo v kódu mimo třídu, pak se vypíše jenom veřejně přístupné datové členy, protože jiné nejsou v kódu mimo třídu viditelné. Tento příklad po spuštění dává tyto výstupy:

Funkce VypisData
a1 => hodnota1
a2 => hodnota2
prot => hodnota3
priv => hodnota4
Přímý výpis
a1 => hodnota1
a2 => hodnota2

Metoda __toString

Metoda __toString slouží k převodu objektu na řetězec. Pokud se snažíme objekt vypsat pomocí funkce echo, nebo print, a máme definovanou metodu __toString, pak se tato metoda zavolá. Řetězec, který vrátí metoda __toString se potom vypíše.

<?php
class pokus
{
  private $nazev = `trida1`;
 
  function __construct($nazev)
  {
    $this->nazev = $nazev;
  }
 
  function __toString()
  {
    return $this->nazev;
  }
}
 
$objekt = new pokus(`ahoj`);
echo $objekt;
?>

Metoda __toString má jednu vadu na kráse, a to tu, že se použije pouze tehdy, pokud se přímo použije jako parametr funkce echo, nebo print. V jiném případě se metoda __toString vůbec nepoužije. Například při přetypování na řetězec se metoda __toString vůbec nepoužije. Například v následujících příkladech se metoda __toString vůbec nezavolá:

// není přímé volání - operátor .
echo `objekt: `.$objekt;
 
// není přímé volání - přetypování na řetězec
echo (string)$objekt;
 
// není přímé volání
echo "objekt: $objekt";

Zato v těchto případech se metoda __toString bude volat:

echo $objekt;
 
echo `objekt: `,$objekt;

Magické metody

PHP verze 5 rezervuje názvy metod, které začínají dvěma podtržítky jako tzv. magické. To znamená, že pokud takto nazvete svojí metodu, může se stát, že někdy v budoucnu bude mít takové metoda nějaký speciální význam v PHP. Proto se doporučuje používat jenom takové magecké metody, které mají nějakou zdokumentovanou speciální funkci v PHP.

V současné době obsahuje PHP tyto magické metody: __call, __construct, __destruct, __get, __set, __sleep, __toString a wakeup. Každá z těchto metod má nějaký speciální vedlejší efekt v PHP.

Metody __sleep a __wakeup

Metody __sleep a __wakeup souvisí se serializací a deserializací objektu. Serializace je postup, jak z objektu vytvořit sekvenci bajtů složitelnou na paměťové médium, třeba disk. Deserializace je opačný postup, kterým se ze sekvence bajtů opět vytvoří původní objekt.

Pro serializaci slouží v PHP funkce serialize a pro opačný postup slouží funkce unserialize. A právě s těmito dvěma funkcemi jsou svázány s metodami __sleep a __wakeup.

Pokud je volána funkce serialize, tato funkce kontroluje, zda objekt obsahuje magickou metodu __sleep. Jestliže metoda __sleep existuje, pak je zavolána před tím, než se provede jakákoli serializace. Výsledkem má být, že metoda __sleep připraví objekt na serializaci. Předpokládá se, že metoda __sleep vrátí pole hodnot se jmény všech datových členů, které se mají serializovat.

Pokud je volána funkce unserialize, zkontroluje se, jestli objekt obsahuje metodu __wakeup. Jestliže je metoda __wakeup přítomná, může se použít pro rekonstrukci všech zdrojů, které objekt může spravovat.

Diskuze (9) Další článek: Ovládejte svoje Pocket PC hlasem

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