Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: karolban 16. 12. 2015, 01:50:58
-
class a {
public $test;
public $passed;
public $passedtwo;
public function __construct ($passed) {
$this->test = 'hodnota_testu';
$this->passed = $passed;
}
public function doit ($passedtwo) {
$this->passedtwo = $passedtwo;
}
}
class b extends a {
public function ukaz () {
echo $this->test;
echo $this->passed;
echo $this->passedtwo;
}
}
$atest = new a ('hodnota_jedna');
$atest->doit('hodnota_dva');
$btest = new b (null);
$btest->ukaz();
Som na prasky z dedicnosti... ani za nic neviem ziskat hodnoty premennych z rodicovskej classy pre pouzitie u dietata, nevyhadzuje to ziadnu chybu ziaden problem, ale premenna je vzdy prazdna. Preco jedine co sa ukaze pri echu z dietata je "hodnota_testu", ako zaregistrovat premenne v parente tak, aby boli k dispozicii pre deti, bud v constructe rodica, alebo cez nejaku funkciu, ktora by zaregistrovala hodnoty, ktore by mali byt potom pristupne cez $this->volaco a to u vsetkych deti.Co mi unika, co robim zle? Dakujem.
-
Objekty $atest a $btest jsou zcela samostatné a na data si vzájemně nevidí. Pokud chceš, aby data byla vidět, místo dědičnosti použij kompozici.
-
Co mi unika
Nepochopil jsi jak fungují objekty a k čemu slouží extends. Zkus tento pokus:
$test = new a ('hodnota_jedna');
$test->ukaz();
$test->doit('hodnota_dva');
$test->ukaz();
-
Co mi unika
Nepochopil jsi jak fungují objekty a k čemu slouží extends. Zkus tento pokus:
$test = new a ('hodnota_jedna');
$test->ukaz();
$test->doit('hodnota_dva');
$test->ukaz();
Tohle vrati chybu, neb ve tride a neni metodat ukaz definovana. Prvni radek by mel byt new b.
Pokud trida b dedi z tridy a, pak to znamena, ze b ma funkcionalitu a a muze k ni neco pridat. Pokud udelam instanci a a pak instanci b, pak jde o zcela nezavisle objekty v pameti, kdy jeden ma funkcionalitu tridy a a druhy funkcionalitu tridy b (vcetne funkci podedenych z a). Tyto dve instance ale nijak nesdili sva data.
-
Prvni radek by mel byt new b.
Ano je to tak, ještě neproběhlo raní kafe :-)
-
Pokud chcete, aby byly proměnné sdílené mezi různými instancemi, použijte statické proměnné.
<?php
class a {
public $test;
public $passed;
public $passedtwo;
public static $statictest;
public function __construct ($passed) {
$this->test = 'A';
$this->passed = $passed;
self::$statictest = 'xxx...';
}
public function doit ($passedtwo) {
$this->passedtwo = $passedtwo;
}
public function ukaz () {
echo "ukazA: test=".$this->test."\n";
echo "ukazA: passed=".$this->passed."\n";
echo "ukazA: passedtwo=".$this->passedtwo."\n";
echo "ukazA: statictest=".self::$statictest."\n";
}
}
class b extends a {
public function ukaz () {
echo "ukazB: test=".$this->test."\n";
echo "ukazB: passed=".$this->passed."\n";
echo "ukazB: passedtwo=".$this->passedtwo."\n";
echo "ukazB: statictest=".self::$statictest."\n";
}
}
$atest = new a ('hodnota_jedna');
$atest->doit('hodnota_dva');
$atest->ukaz();
$btest = new b ('jina_hodnota');
$btest->ukaz();
?>
-
Pokud chcete, aby byly proměnné sdílené mezi různými instancemi, použijte statické proměnné.
Doufal jsem, že to ještě nějakou chvilku zůstane před začátečníkem utajeno.
-
Pravda, sluší se podotknout, že do statických proměných patří jen dobře vybraná podmnožina všech třídních proměnných. Obvykle jich v celém programu bude nanejvýš jen několik. Pokud se tam dávají nějaké konfigurační hodnoty, hodí se přidal ještě final, aby se nemohly za běhu měnit.