Magické metody umožňují programátorovi přenést na PHP starost o některé speciální a jiným způsobem těžko proveditelné úkoly, nezbytné při práci s OOP.

Mezi magické metody patří také speciální metody a metody __toString(), __sleep(), __wakeup() a __set_state().

Metoda __toString() je volána automaticky, když používáme funkci echo nebo print k vypsání proměnné, k níž byla přiřazena instance třídy. Příklad:

<?php 
  class UzitiToString{ 
  private $vlastnost; 
    public function __construct($vlastnost){ 
      $this->vlastnost = $vlastnost; 
    } 
    public function __toString(){ 
      return $this->vlastnost; 
    } 
  } 

$ins = new UzitiToString('toString'); 
echo $ins; 
?>

Metoda __toString() se používá především při ladění a v praxi ji můžete využít například pro zjišťování, zda dotaz na databázi nějaké řádky vrátil nebo upravil.

Ve verzi 5.1 přibyla do PHP nová magická metoda __set_state(), kterou použijete v souvislosti s funkcí var_export(). Tato funkce je velmi podobná ladícím funkcím var_dump() a print_r(), které vypisují informace o proměnné. Narozdíl od nich však var_export() vrací validní PHP kód:

<?php 
$pole = array(1, 2, 3); 

var_export($pole); 
?>

Tento skript vypíše následující:

array ( 0 => 1, 1 => 2, 2 => 3, )

Vše funguje správně, dokud není jedním z parametrů pole objekt. Pak totiž PHP nevrátí validní kód. Místo toho vrátí něco podobného:

array ( 
  0 => 
  class myclass { 
    var $myProperty = 'myValue'; 
  }, 
);

To je samozřejmě nesmysl, proto byla do PHP zavedena statická magická metoda __set_state(), která je volána automaticky při aplikaci var_export() na objekt. Metoda přijímá pole atributů:

<?php 
class Trida { 
  private $atribut; 
  public $atribut2 = 3; 
  public function __construct($atribut){ 
    $this->atribut = $atribut; 
  } 
  public static function __set_state(array $args){ 
    $inst = new self($args['atribut']); 
    $inst->atribut2 = $args['atribut2']; 
    return $ins; 
  } 
} 

$obj = new Trida('hodnota'); 
var_export($obj); 
?>

Díky magické metodě __set_state() lze s funkcí var_export() pracovat, i když jí předáte objekt.

Metody __sleep() a __wakeup() se používají při procesu serializace. Serializace převede do byte řetězce proměnné objektu. O metodách __sleep() a __wakeup() vyšel dostatečně podrobný článek PHP pro pokročilé – znovu třídy a objekty a jelikož se tyto metody používají méně často, bylo by zbytečné psát článek podobný.

Pozn. red.: Zdůrazňujeme, že tento text se týká PHP 5.

Žádný příspěvek v diskuzi

Odpovědět