Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: karolban 16. 12. 2015, 01:50:58

Název: Dědičnost mezi rodičovskou a extended třídou
Přispěvatel: karolban 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.
Název: Re:Problem dedicnosti medzi rodicovskou a extended triedou.
Přispěvatel: Kit 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.
Název: Re:Problem dedicnosti medzi rodicovskou a extended triedou.
Přispěvatel: k 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();
Název: Re:Problem dedicnosti medzi rodicovskou a extended triedou.
Přispěvatel: JmJ 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.
Název: Re:Problem dedicnosti medzi rodicovskou a extended triedou.
Přispěvatel: k 16. 12. 2015, 07:58:39
Prvni radek by mel byt new b.

Ano je to tak, ještě neproběhlo raní kafe :-)
Název: Re:Dědičnost mezi rodičovskou a extended třídou
Přispěvatel: Ondrej Nemecek 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();

?>
Název: Re:Dědičnost mezi rodičovskou a extended třídou
Přispěvatel: Kit 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.
Název: Re:Dědičnost mezi rodičovskou a extended třídou
Přispěvatel: Ondrej Nemecek 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.