Object

Objekt je základní třída, která by měla bát základem všech tříd, které nejsou statické. Díky této třídě získáte několik zajímavých vlastností:

  • zavedení property,
  • unifikované chování při volání neexistující proměnné / metody – bude vyhozena výjimka,
  • metody getClass a getAncestors, jenž vracejí jméno třídy, respektive pole předků daného objektu,
  • možnost rozšířit třídu o další metody.

Property

Property jsou vlastně členské proměnné. Díky třídě object nyní je můžete efektivně používat, například z nich udělat pouze „read-only“ (pouze pro čtení).

Veškeré volání metod get*** lze zkrátit jako čtení členské proměnné ***. Stejně tak volání set*** se zkracuje zápisem do členské proměnné ***.

class Square extends Object
{
     private $a;
     public function setA($a)
     {
          $this->a = (int) $a;
     }
     public function getA()
     {
          return $this->a;
     }
     public function getArea()
     {
          return $this->a * $this->a;
     }
}

$square = new Square;
$square->a = 5;

echo "area: " . $square->area; # stejne jako $square->getArea();

Jak je vidět v ukázce, area je property, který slouží jen pro čtení, není implementována metoda setArea. Pokus o nastavení členské proměnné area by skončil vyhozením výjimky.

Vyhození výjimky při neexistující metodě / proměnné

Pokud Vaše třída nemá definovanou členskou proměnnou nebo metodu, pak je vyhozena výjimka OutOfBoundsException, respektive BadMethodCallException.

class Test extends Object {}

try {
    $test = new Test;
    $test->foo();
} catch (Exception $e) {
   ...
}

Dané chování si samozřejmě můžete přepsat pomocí magických metod __call, __set, atp.

Získání jména a předků

Význam metod je snad ze jmen a ukázky jasný. Metoda getAncestors vrací pole, jako první prvek je obsaženo i jméno aktuální třídy.

class Test extends Object {}
$class = new Test;

echo $class->getClass();
# vypise "Test"
# alternativa ke get_class($class);



print_r($class->getAncestors());
# vrati pole array('Text', 'Object');

Rozšíření třídy o metodu

Třídu můžete jednoduše rozšířit o nějakou metodu. Dané metoda bude mít ovšem samozřejmě přístup pouze k veřejným členským proměnným a metodám. K rozšíření se používá statická metoda extendMethod, jejímž prvním parametrem je název metody, pod jakým bude daná funkce přístupná. Název této funkce musí být v PHP 5.2 povinně doplněn jménem třídy, na jakou tuto metodu přidáváte.

class Text extends Object
{
    public $names = array();
    public function add($name)
    {
        $this->names[] = $name;
    }
}

function printTextNames($_this, $separator = ", ")
{
     return implode($separator, $_this->names);
}

Names::extendMethod('text::printall', 'printtextnames');


$names = new Names();
$names->add('Jan Skrasek');
$names->add('Petr Pribyl');
$names->add('Martin Omacka');

echo $names->printall();