Objekty v PHP 5 - 5. díl

Dnešní díl našeho programátorského seriálu o PHP 5 pojednává o klíčovém slově final a o klonování objektů.

Klíčové slovo final

Občas se hodí, když omezíme dědičnost u některých metod, nebo u celých tříd. A právě k omezení dědičnosti slouží klíčové slovo final. Pokud použijeme slovo final u metody, říkáme tím, že metoda se nesmí předefinovat v žádném potomkovi. Taková metoda je tedy konečná. Následující kód tedy skončí chybou:

<?php
class zakladni_trida
{
  final public function Metoda()
  {
    echo `Metoda() zavolána<br>`;
  }
}
 
class odvozena_trida extends zakladni_trida
{
  public function Metoda()
  {
    // toto nejde
  }
}
?>

Klíčové slovo final je možné použít i pro celou třídu. V takovém případě nelze od třídy vůbec dovodit žádného potomka. Následující příklad tedy skončí také chybou:

<?php
final class zakladni_trida
{
  public function test()
  {
  }
}
 
class odvozena_trida extends zakladni_trida
{
  // toto nejde
}
?>

Klonování objektů

V klonování objektů je jeden z velkých rozdílů mezi PHP verzemi 4 a 5. Pokud provedeme přiřazení objektů, tak v PHP verze 4 se objekty zkopírují, zatímco v PHP verze 5 se pouze přiřazují jenom reference (odkazy). Chceme-li přiřadit referenci v obou verzích PHP, pak je potřeba použít zápis:

$objekt2 =& $objekt1;

Pokud chceme v PHP verze 5 také zajistit kopírování objektů, využívá se techniky zvané klonování. Pro klonování objektu stačí použít slovo clone:

$objekt2 = clone $objekt1;

Samotné PHP provádí klonování vytvořením tzv. mělké kopie objektu. Jakékoli datové členy, které jsou referencemi také po vytvoření mělké kopie objektu referencemi zůstanou. Pokud nám stačí mělká kopie objektu, nemusíme dělat nic dalšího. Pokud nám mělká kopie objektu nevyhovuje, je potřeba u třídy nadefinovat metodu __clone, která bude vyvolaná vždy, když se bude používat klonování objektu.

Zde je příklad, jak je možné napsat vlastní metodu __clone použitou pro klonování objektu, pokud nám standardní chování klonování objektu nevyhovuje:

<?php
class pokus
{
  static $pocet_objektu = 0;
  public $cislo_instance;
 
  public function __construct()
  {
    $this->cislo_instance = ++self::$pocet_objektu;
  }
 
  public function __clone()
  {
    $this->cislo_instance = ++self::$pocet_objektu;
  }
}
 
$objekt1 = new pokus;
echo `Číslo objektu je `,$objekt1->cislo_instance,`<br>`;
 
$objekt2 = clone $objekt1;
echo `Číslo objektu je `,$objekt2->cislo_instance,`<br>`;
?>

Stejně tak je nutné použít metodu __clone, pokud nám nestačí vytvoření mělké kopie a požadujeme kopie všech datových členů:

<?php
class prazdny_objekt
{
}
 
class pokus
{
  public $objekt;
 
  public function __clone()
  {
    $this->objekt = clone($this->objekt);
  }
}
 
$o = new pokus;
$o->objekt = new prazdny_objekt;
 
$o2 = clone $o;
?>

Váš názor Další článek: CeBIT: Microsoft se chce zbavit hesel

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