OOP v PHP: Přetěžování
Metody přetěžování jsou volány v případě, že zadáváte vlastnost nebo metodu, která není definována.
Mezi tyto metody patří __get(), která je volána, pokud je nedefinovaná vlastnost zpřístupněna pro čtení, metoda __set() je použita v případě, že použijete nedefinovanou vlastnost pro zápis, a metoda __call() je použita v případě, že voláte metodu, která není definována.
Podívejme se na následující příklad:
<?php
class MetodaGet{
public $n;
private $x = array("a" => 1, "b" => 2, "c" => 3);
public function __get($jmeno){
echo "Jméno předané hodnoty $jmeno
";
if(isset($this->x[$jmeno])){
$r = $this->x[$jmeno];
echo "Hodnota je uložena v poli $r
";
}else{
echo "Hodnota neexistuje
";
}
}
}
$ins = new MetodaGet();
$ins->n = 1;
$ins->a++;
$ins->z++;
?>
Příklad ukazuje volání neexistujících vlastností a a z. Jelikož vlastnosti nebyly předem nikde určeny, třída automaticky použije metodu __get() (z anglického „dostat“), která dále testuje hodnoty předané této metodě.
Použití metody __set() (z anglického „nastavit“) je velmi podobné, bude volána v případě, že nedefinované vlastnosti přiřadíte hodnotu. Vše objasní následující příklad:
<?php
class PouzitiMetodySet{
public function __set($vlastnost, $hodnota){
echo "Byla volána nedefinovaná vlastnost
- $vlastnost - s hodnotou - $hodnota";
}
}
$ins = new PouzitiMetodySet;
$ins->NejakaNedefinovanaVlastnost = 'jeji hodnota';
?>
Metoda __call() (z anglického „volat“) má naprosto stejné použití jako předchozí dvě metody, ovšem užívá se při práci s předem nedefinovanými metodami. Tedy:
<?php
class PouzitiMetodyCall{
public function __call($metoda, $parametry){
echo "Byla volána nedefinovaná metoda $metoda";
if(isset($parametry[0])){
echo "Metoda obsahovala parametry $parametry[0]";
}
}
}
$ins = new PouzitiMetodyCall;
$ins->NejakaNedefinovanaMetoda('parametr');
?>
Obecně řečeno je přetěžování speciálním mechanismem OOP, který nám umožňuje vyrovnat se s používáním libovolných proměnných a metod, aniž by byly přesně definovány.
Pozn. red.: Zdůrazňujeme, že tento text se týká PHP 5.







