Autor Zpráva
Ivan M.
Profil *
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
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 *
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
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 *
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 *
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
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ě.

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: