Autor Zpráva
ref
Profil *
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
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 *
Nešlo by tomu novému objektu přiřadit stejnou referenci jako měl ten starý?
Nox
Profil
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
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 *
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ě.)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0