| 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: 15 let
|
|||
0