Portál AbcLinuxu, 26. listopadu 2025 09:02
class Parser{
function __construct($obj){
$this->$obj = $obj;
}
function __get(){
# Nevím jak tady zavolat ten objekt $obj. Zkoušel jsem toto
$this->obj->metoda;
# ale nefunguje to
}
}
Řešení dotazu:
$this->$obj = $obj; má být $this->obj = $obj;. $this->$obj totiž pro jméno proměnné použije výsledek volání $obj->__toString()$this->obj->metoda()public $obj = NULL; (nebo bez inicializace).
public - to mi ujelo.
<?php
class Parser {
private $obj = array();
function __set($key, $value) {
$this->obj[$key] = $value;
}
function __get($key) {
return $this->obj[$key];
}
}
$registr = new Parser();
$registr->smysl = 42;
$registr->kopa = 60;
echo "Kopa je $registr->kopa kusů, smyslem života je $registr->smysl";
Jenže pokud potřebuješ něco takhle primitivního, vystačíš si i se standardní třídou stdClass, která to už umí.
__get() a __set() v PHP jsem nikdy nepochopil. Přijde mi, že gettery a settery jako takové, mají dvě výhody.
public function getFoo() { ... }
public function setFoo($foo) { ... }
$obj->getFoo() nemůžeš použít ve stringu (šabloně), ale $obj->foo tam použít můžeš - normálně se expanduje. Ládovat všechno do pomocných proměnných před šablonou je poněkud nepraktické.
Jak jsem psal, ten mnou popsaný způsob pouze popisuje volání - jako v manuálu. V této podobě to už nepoužívám. Nepoužívám gettery/settery a nepoužívám ani public proměnné.
Stačí použít vhodný switchUrčitě souhlas, ale asi by se mi to moc nelíbilo.
Metodu $obj->getFoo() nemůžeš použít ve stringu (šabloně)Díky, tohle mě nenapadlo. Já většinou používám Laravel a tam by s tím problém nebyl.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.