Portál AbcLinuxu, 10. května 2025 02:47
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.