Door
Reshad F
op 04-11-2012 15:49
gewijzigd op 04-11-2012 17:57
4.041 views
Hello OOP specialisten vooral :)
Ik ben na lange tijd maar weer is achter de PHP classes oefeningen gedoken.
Voor een nieuwe oefening dacht ik een navigatie menu te maken d.m.v. een Navigation class. Waar ik nu precies naar benieuwd ben, wat moet er zoal in en waar moet ik rekening mee houden. zijn er dingen die minimaal in een navigaton class moeten komen? ( denk hierbij aan de interface class ) etc...
alle tips zijn welkom :)
[offtopic]
ik post de vraag ook op andere fora dus wees niet verrast als je het tegenkomt, uiteraard zal ik het uiteindelijke resultaat overal neerzetten.
[/offtopic]
hmm @Raoul als ik deze twee nu wil scheiden. moet/kan ik dan gewoon de item methods in een andere class zetten en de class aanroepen in mijn navigation constructor?
en vervolgens in mijn display(); methode de methodes ervan ook aanroepen?
of is hier een andere manier voor..
Opzetje:
<?php
class Navigation
{
private $_items = null;
public function addChild(Navigation_Item $item)
{
$this->_items[] = $item;
}
public function render()
{
$html = '<ul>';
foreach($this->_items as $item)
{
$html .= $item->render();
}
$html .= '</ul>';
return $html;
}
}
class Navigation_Item
{
private $_link;
private $_text;
public function setLink($link)
{
$this->_link = $link;
}
public function setText($text)
{
$this->_text = $text;
}
public function getLink()
{
return $this->_link;
}
public function getText()
{
return $this->_text;
}
public function render()
{
return '<li><a href="' . $this->getLink() . '">' . $this->getText() . '</a>';
}
}
?>
Ik zou 2 aparte render klasses maken en 1 hoofd rederer die je dan kunt aanroepen. Een UlRenderer en een LiRenderer en die samenvoegen in een ListRenderer die dan zoiets wordt:
<?php
class ListRenderer
{
// ...
public function render()
{
$builder = $this->getFormBuilder();
$items = array_map($builder->getItems(), function($item) {
$item = new LiRenderer($item);
return $item->render();
});
$list = new UlRenderer($items);
return $list->render();
}
}
?>
Maar nu ik dit schrijf denk ik dat dit iets teveel in klassen proppen wordt. Die Ul en Li Renderers zullen toch nooit iets anders worden, beter is daar gewoon 2 aparate methods van te maken in de ListRenderer klasse.