- Aplikace
- Databáze
- Šablony
- Formuláře
- Knihovny
- Návody
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
getClassagetAncestors, 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();
