Autor | Zpráva | ||
---|---|---|---|
Ivan M. Profil * |
#1 · Zasláno: 4. 11. 2013, 11:11:49
Ahoj, měl bych dotaz.. Pročpak se mě (viz poslední řádek) nevypíše zadaná proměnná?
Popravdě s PHP moc zkušeností nemám, ale dle mě by to takto mělo být správně.. Mám třídy: class ListView { private $Font; ... public function GetFont() { return $this->Font; } } class ListViewItem extends ListView { public $Font; public function ListViewItem($text) { $this->Font = parent::$Font; } } ******** $lView = new ListView(); $lView->Font = 'Font-Family: arial'; $lvItem = new ListViewItem("Standa"); echo $lvItem->Font; // Nic se mi nevypíše ???? |
||
Radek9 Profil |
#2 · Zasláno: 4. 11. 2013, 11:55:33
Ivan M.:
Protože je private . Pokud chceš přístup ze zděděné třídy, musíš použít protected . Pokud i zvenčí, musíš použít public .
|
||
Ivan M. Profil * |
#3 · Zasláno: 4. 11. 2013, 12:10:58
Omlouvám se, psal jsem to z hlavy, potomka mělo být:
class ListViewItem extends ListView { public $Font; public function ListViewItem($text) { $this->Font = parent::GetFont() } } |
||
Alphard Profil |
#4 · Zasláno: 4. 11. 2013, 12:15:41
Dědičnost se uplatňuje při skládání objektů, tj. ve chvíli, kdy parser prochází kód a vytvoří „interní reprezentaci třídy“ z více programových úseků. Po vytvoření instance žádné vazby mezi potomky a rodiči nejsou.
Navíc používáte statický přístup k nestatické metodě (vlastnosti). Určitá míra zapouzdření a nezávislosti instancí je jedna z hlavních východ tohoto přístupu. Ovlivňovat změnou jedné instance jinou instanci by nedávalo smysl. |
||
Ivan M. Profil * |
#5 · Zasláno: 4. 11. 2013, 12:19:51 · Upravil/a: Ivan M.
Dobře děkuji, mohli by jste mi prosím uvést, jak v PHP správně zdědit požadovanou proměnnou? Velice děkuji.
Jde mi o to, že každý potomek dané třídy, by si převzal (zdědil) vlastnost Fontu rodičovského Controlu, v případě že jej u potomka nedefinuju separátně |
||
Alphard Profil |
Kdyby ten font byl stále stejný a mohl být inicializován hned v hlavičce, bylo by to pro vás nejjednodušší
protected $font = 'arial';
Jinak je řešení tohoto problémů složité, existuje hodně více či méně špatných řešení, z nichž aktuálně pro vás nejlepší by bylo explicitně předávat každé instanci objekt s konfigurací. |
||
Ivan M. Profil * |
#7 · Zasláno: 4. 11. 2013, 13:20:19 · Upravil/a: Ivan M.
No a to je právě ten problém, že "ten" font není stále stejný a přijde mi hloupé zadávat při každé deklaraci znovu ten stejný zápis :D
proto jsem to chtěl zkusit tady na foru, že by byl někdo ochotný mi pomoct s řešením Předem děkuji Jde o to, že mám třeba 500 záznamů v tabulce a z toho jich je X označeno jiným fontem (zvýraznění)... Při vykreslování Controlu ListView volám metodu, v níž se odkazuji na $item->Font / tedy prvek ListViewItem, který obsahuji daný styl fontu Inu mohu při deklaraci zapsat: foreach ($zaznamy as $id => $zaznam) { $lvItem = new ListViewItem($zaznam->Jmeno); $lvItem->Font = "font-weight: " . $zaznam->Precteno === true ? "normal" : "bold"; } *********************** Ale představoval jsem si to takto: foreach ($zaznamy as $id => $zaznam) { $lvItem = new ListViewItem($zaznam->Jmeno); if (!$zaznam->Precteno) $lvItem->Font = "font-weight: bold"; } |
||
Alphard Profil |
#8 · Zasláno: 5. 11. 2013, 20:47:08
Možná vám přesně nerozumím, ale ve vašem záměru nevidím problém. Máte nějakou sadu záznamů a část z nich je zvýrazněná, je to vlastnost té konkrétní instance, ne rodiče. Ten poslední kód, co jste uvedl, přece musí fungovat. Jen bych možná ještě zvýšil abstrakci,
$lvItem->highlighted = true .
Tím u každé konkrétní instance určíte, jestli je zvýrazněná a konkrétní vzhled může být pevně napsaný v děděné třídě. |
||
Časová prodleva: 11 let
|
0