Dědičnost mezi rodičovskou a extended třídou

Dědičnost mezi rodičovskou a extended třídou
« kdy: 16. 12. 2015, 01:50:58 »
Kód: [Vybrat]
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.
« Poslední změna: 16. 12. 2015, 10:24:33 od Petr Krčmář »


Kit

Re:Problem dedicnosti medzi rodicovskou a extended triedou.
« Odpověď #1 kdy: 16. 12. 2015, 04:10:49 »
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.

k

Re:Problem dedicnosti medzi rodicovskou a extended triedou.
« Odpověď #2 kdy: 16. 12. 2015, 06:00:08 »
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();

JmJ

  • ****
  • 302
    • Zobrazit profil
Re:Problem dedicnosti medzi rodicovskou a extended triedou.
« Odpověď #3 kdy: 16. 12. 2015, 07:48:29 »
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.

k

Re:Problem dedicnosti medzi rodicovskou a extended triedou.
« Odpověď #4 kdy: 16. 12. 2015, 07:58:39 »
Prvni radek by mel byt new b.

Ano je to tak, ještě neproběhlo raní kafe :-)


Re:Dědičnost mezi rodičovskou a extended třídou
« Odpověď #5 kdy: 16. 12. 2015, 12:24:53 »
Pokud chcete, aby byly proměnné sdílené mezi různými instancemi, použijte statické proměnné.

Kód: [Vybrat]
<?php
class {

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 
extends {

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 ('hodnota_jedna');
$atest->doit('hodnota_dva');
$atest->ukaz();

$btest = new ('jina_hodnota');
$btest->ukaz();

?>

Kit

Re:Dědičnost mezi rodičovskou a extended třídou
« Odpověď #6 kdy: 16. 12. 2015, 13:02:59 »
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.

Re:Dědičnost mezi rodičovskou a extended třídou
« Odpověď #7 kdy: 17. 12. 2015, 12:50:48 »
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.