marca 31 2008
Dostęp do tablic poprzez magiczną metodę __get() w PHP5
Przypuśćmy, że mamy klasę i chcemy w niej za pomocą magicznej metody __get otrzymywać dostęp do pewnej tablicy:
class test {
private $ar=array('field'=>array());
public function __get($name){
return $this->ar[$name];
}
public function showMe(){
var_dump($this->ar['field']);
}
}
$a=new test;
$a->field[]='testValue';
$a->showMe();
Spodziewamy się, że za pomocą $a->field[]=’testValue’; dodamy do tablicy $a->ar['field'] wartość ‘testValue’. Jednak jak możemy się przekonać listując potem tablicę wcale tak się nie dzieje! Otóż tablice zwracane są w metodzie __get poprzez wartość, a nie referencję.
Rozwiązanie
Zamiast tablicy skorzystamy z .. obiektów, które w PHP5 zawsze są zwracane przez referencję. Doskonałym zamiennikiem zwykłej tablicy jest obiekt ArrayObject.
class test {
private $ar=array('field'=>array());
public function __construct(){
$this->ar['field']=new ArrayObject;
}
public function __get($name){
return $this->ar[$name];
}
public function showMe(){
var_dump($this->ar['field']);
}
}
$a=new test;
$a->field[]='testValue';
$a->showMe();
No i działa :]

