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: Software, Programování, PHP, Echo, Díl, Objekt


Určitě si přečtěte

Google ADT-2: Miniaturní krabička s Android TV 8.0, kterou si nikdy nekoupíte

Google ADT-2: Miniaturní krabička s Android TV 8.0, kterou si nikdy nekoupíte

** Dlouho se nevědělo, co to přesně má být ** Pak se s krabičkou Google pochlubil na I/O ** Do „Chromecastu“ vtěsnal celý Android TV

Jakub Čížek | 24

Rekordy počasí: V Česku to ještě jde, skutečné extrémy zažívají jinde

Rekordy počasí: V Česku to ještě jde, skutečné extrémy zažívají jinde

** Teplotní extrémy dokážou překvapit. Seznamte se s rekordy v Česku i ve světě ** Rekordní hodnoty jsou mnohdy až k neuvěření ** Zjistěte, kdy ke bylo největší horko, zima, déšť či vítr

Karel Kilián | 7

Portál občana už funguje. Na státní web vypadá až překvapivě použitelně

Portál občana už funguje. Na státní web vypadá až překvapivě použitelně

** Portál občana už funguje, vyřídíte na něm první požadavky ** Funkce se budou postupně rozšiřovat ** Web je docela moderní a přehledný

David Polesný | 65

Porno insider: Jak virtuální realita vstupuje do filmů pro dospělé

Porno insider: Jak virtuální realita vstupuje do filmů pro dospělé

** Pornografie údajně představuje třetinu internetové obsahu a je technologický tahounem ** Do erotického obsahu postupně zasahuje i virtuální realita ** Kromě vizuálního vjemu se pracuje také na virtuálním uspokojení toho hmatového

Jan Dudek | 28

Jak dopadl velký den Applu s náloží novinek: Sledujte, co letos připravil

Jak dopadl velký den Applu s náloží novinek: Sledujte, co letos připravil

** Apple večer představil novinky ** Ukáže nové operační systémy, ale čekala se i nová zařízení ** Začíná vývojářská konference Applu WWDC 2018

Karel Javůrek | 87


Aktuální číslo časopisu Computer

Velký test 18 bezdrátových sluchátek

Vše o přechodu na DVB-T2

Procesory AMD opět porážejí Intel

7 NVMe M.2 SSD v přímém souboji