Autor | Zpráva | ||
---|---|---|---|
ref Profil * |
#1 · Zasláno: 25. 7. 2010, 02:56:04
Mám následující kód:
class Vnoreny { private $ttt = 'default'; function set($ttt) { $this->ttt = $ttt; } function get() { return $this->ttt; } } class Test { private $objekt; function novy() { $this->objekt = new Vnoreny; return $this; } function &get() { return $this->objekt; } } $obj = new Test; $vnoreny = $obj->novy()->get(); $vnoreny->set('PROM'); echo $vnoreny->get(); $obj->novy(); echo $vnoreny->get(); Potřeboval bych ho nějak upravit, aby po provedení "$obj->novy();" mi "echo $vnoreny->get();" vrátil "default". To celé aniž bych musel znovunastavovat proměnnou "$vnoreny". Myslel jsem že toho docílím pomocí té reference, ale jak vidím tak ne. Ca dělám špatně, jak by to mělo vypadat? |
||
Majkl578 Profil |
#2 · Zasláno: 25. 7. 2010, 04:28:04 · Upravil/a: Majkl578
Reference se u objektů nepoužívají, předávají se automaticky jako odkaz. Navíc tvoje úvahy jsou mylné - ikdyž objekt v
Test::$objekt přepíšeš, stále existuje, protože ho na řádku 27 přiřazuješ proměnné $vnoreny . Proto volání na řádku 31 vrací stejnou hodnotu - vytvořil jsi nový objekt v Test::$objekt , ale v $vnoreny je stále původní instance. Řešením by bylo upravit řádek 30 takto: $vnoreny = $obj->novy(); .
|
||
ref Profil * |
#3 · Zasláno: 25. 7. 2010, 12:50:36
Nešlo by tomu novému objektu přiřadit stejnou referenci jako měl ten starý?
|
||
Nox Profil |
#4 · Zasláno: 25. 7. 2010, 13:48:20
ref:
Není mi jasné o co se pokoušíš, na řádku 30 nijak neukládáš vrácenou hodnotu a objekt $vnoreny tudíž zůstává stejný Navíc mi to celé přijde trochu nesmyslné, Test nějak slouží pouze k vytvoření objektu a vrácení poslední instance přičemž ostatní se zahazují, Vnořený vlastně "vnořený" být asi nemusí jelikož tuhle vlastnost nijak nevyužíváš Navíc jak ti Majkl578 psal v příspěvku před tebou - nemá smysl u objektů pracovat s referencemi když samotná proměnná uchovává jen identifikátor, abys předal hodnotou musel bys použít clone |
||
Majkl578 Profil |
#5 · Zasláno: 25. 7. 2010, 17:35:54
ref:
Spíš bych to označil za chybu návrhu. Zkus rozepsat o co se pokoušíš a dát sem kód, vsadil bych se, že to půjde řešit lépe. |
||
ref Profil * |
#6 · Zasláno: 25. 7. 2010, 19:20:40
Třída Storage, která vytvoří singleton obsahuje pole s jednotlivými drivery (např. TextFile, Postgresql apod.). Třeba toto vloží do pole $storages novou hodnotu "jmeno=>objekt":
Storage::getInstance()->setDriver('TextFile')->setName('jmeno')->init()->export(); Kdekoliv v aplikaci potom mohu provést Storage::getInstance()->export('jmeno'); a dostanu se ke kýženému úložišti. Rád bych aby veškerá práce s úložištěm šla přes Storage, který by kontroloval zda je úložiště k dispozici, otevíral a příp. uzavíral úložiště apod. Takhle si vyexportuju objekt třídy TextFile a se Storage se pak vůbec nepracuje (samozřejmě mohu volat pokaždé Storage::getInstance()->export('jmeno')->fce...", ale není to povinnost. (Kód nemohu poskytnout protože to mám zatím jen v hlavě.) |
||
Časová prodleva: 14 let
|
0