Autor Zpráva
Sunucuu
Profil
Ahoj,

řeším takový hloupý problém, jak získat proměnnou z rodičovské třídy. Jde mi o to, že když použiji tento kód, tak se fce SetVar() spustí 2x a to nechci... Chci jí spustit pouze v rodičovské třídě a v potomkovi již pouze vypsat proměnnou, která byla naplněna funkcí SetVar v rodičovské třídě.

Kód je následující:

<?php
class Rodic {
public $variable;

public function __construct(){
$this->SetVar();
}

public function SetVar() {
return $this->variable = 'foo';
}

}

class Dite extends Rodic {

public function __construct(){
parent::__construct();
echo $this->variable;
}
}

$a = New Rodic;

$b = New Dite;

?>


Problém mě napadlo řešit skrz static... Což funguje přesně tak, jak já potřebuji, ale static používat nechci...
<?php
class Rodic {
public static $variable;

public function __construct(){
$this->SetVar();
}

public function SetVar() {
return self::$variable = 'foo';
}

}

class Dite extends Rodic {

public function __construct(){
#parent::__construct();
echo Rodic::$variable;
}
}

$a = New Rodic;

$b = New Dite;

?>



Nějaké nápady, jak vyřešit tento problém? Respektive jak přepsat řešení ze static do předchozího případu, aby to fungovalo jako v případě static? Tzn pouze 1x se spustí fce SetVar() a poté se již vypíše získaná hodnota proměnné...

Když nad tím tak přemýšlím, tak bych nejraději všechno dělal jen přes static, jelikož to je jednoduché, ale něco mi říká, že to asi nebude to pravé ořechové a proto bych rád našel nějaký způsob, jak to řešit "normálně"...

Děkuji za každou radu.


Btw, jestli tam je nějaká drobná chyba, tak se omlouvám, psal jsem to za pochodu a má to pouze demonstrační účel. (doufám, že se mi to aspoň malinko povedlo, aby jste věděli o co mi jde...)
V reálném použití vypisuje fce SetVar() spoustu dat z databáze a kvůli výkonu si nemohu dovolit vypisovat data i v potomcích, když už jsem je selectoval v rodičovské třídě... Potřebuji k nim pouze přistoupit :) (bez použítí static, respektive static se nebráním, ale kdybych o tom přemýšlel, tak budu používat všude asi jen static, protože se mi s nimi pracuje dobře...)


Doufám, že jsem to dostatečně vysvětlil :)
Alphard
Profil
Jsem z toho poněkud zmatený, bez ohledu na extends, které funguje jinak, neexistuje žádný vztah mezi $a a $b. Případné předávání proměnných by bylo třeba řešit explicitně nějakými metodami.

Statická proměnná se vypíše, protože ji viditelná pro celý svět. Vypsala by se i kdyby Dite nedědilo od Rodic.
Sunucuu
Profil
Prostě potřebuji vypsat v potomkovi proměnnou "variable" s hodnotou "foo" bez toho, abych musel spustit znovu SetVar...
Ugo
Profil
Ahoj, na toto odpovídám moc rád, protože jsem v tom taky míval guláš než jsem si to rozdělil. Snažíš se motat dohromady třídy a jejich instance (objekty podle třídy). Nevím jak to funguje, ale pro přčedstavu si vem, že při kompilaci se nejprve udělají definice tříd a až pak se vytváří instance ($a=new A();) tudíž v době kdy by to bylo třeba tak krom toho že nemá vědět o ostatních instancích (to je právě ta výhoda oop), tak to vědět ani nemůže, static zas patří třídě, je v aplikaci jednou a víceméně je to jen globální proměnnná, tu tedy uvidíš vždy všude, jak řekl Alphard, není třeba ani dědictví.

Dědictví se váže tedy na třídu, nikoliv na instanci, zdědíš to co je v definici - funkce, nadefinované proměnné v jejich defaultní hodnotě, nikoliv v hodnotě které náleží vytvořené instanci.

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: