2012-11-04 57 views
1

我鍛鍊了一些PHP OOP,因此我正在創建一個類來創建一個簡單的導航菜單(將來會有擴展名),現在我已經構建了這個類, ..我不;知道如何使用數組在我的課使用類像在PHP中使用數組類

<?php 
$menu = new Navigation("Test", "mainmenu"); 

$menu->setMenuItem("home", "test"); 
echo $menu->display(); 

?> 

,你看,我應該能夠給每個菜單項與setMenuItem();方法。 但因爲它沒有在此刻使用數組我只得到了第一個值

類本身如下:

<?php 
class Navigation implements navigationInterface { 

    public $menu = null; 
    public $name = null; 
    public $klasse = null; 

    public function __construct($name, $klasse) { 

     $this->name = $name; 
     $this->klasse = $klasse; 

    } 

    public function getName() { 
     return $this->name; 
    } 

    public function getClass() { 
     return $this->klasse; 
    } 

    public function setMenuItem($items) { 
     $this->menuItem = $items; 
    } 

    public function getMenuItem() { 
     return $this->menuItem; 
    } 

    public function display() { 

     $menu = '<nav class="' . $this->getName() . '">'; 
     $menu .= '<li><a class="' . $this->getClass() . '" href="index.php?page=' . $this->getMenuItem() . '.php">' . $this->getMenuItem() . '</a></li>'; 
     $menu .= '</nav>'; 

     return $menu; 

    } 
} 
?> 

誰可以告訴我如何組合類中使用數組用循環創建一個具有所有給定值的菜單?

在此先感謝。

回答

4
<?php 
class Navigation{ 

    public $menu = null; 
    public $name = null; 
    public $klasse = null; 

    public function __construct($name, $klasse) { 

     $this->name = $name; 
     $this->klasse = $klasse; 

    } 

    public function getName() { 
     return $this->name; 
    } 

    public function getClass() { 
     return $this->klasse; 
    } 

    public function setMenuItem($items) { 

     $this->menuItem = $items; 
    } 

    public function getMenuItem($menu) { 
     return $menu; 
    } 

    public function display() { 

     $menu = '<nav class="' . $this->getName() . '">'; 
     if(is_array($this->menuItem)) 
     { 
     foreach($this->menuItem as $val) 
     { 
     $menu .= '<li><a class="' . $this->getClass() . '" href="index.php?page=' . $this->getMenuItem($val) . '.php">' . $this->getMenuItem($val) . '</a></li>'; 
     } 
     } 
     else{ 
      $menu .= '<li><a class="' . $this->getClass() . '" href="index.php?page=' . $this->getMenuItem($this->menuItem) . '.php">' . $this->getMenuItem($this->menuItem) . '</a></li>'; 

     } 


     $menu .= '</nav>'; 

     return $menu; 

    } 
} 
?> 

<?php 
$menu = new Navigation("Test", "mainmenu"); 

$menu_items=array("home","test"); 
$menu->setMenuItem($menu_items); 

echo $menu->display(); 

?> 
0

在你的類

$menuItems = array(); 

那麼頂部setMenuItem()

function setMenuItem($name, $value) 
{ 
    $this->menuItems[] = array($name, $value); 
} 

然後

function display() 
{ 
    // Your other code here 
    foreach($this->menuItems as $item) 
    { 
    echo '<li><a href="'.$item[1].'">'.$item[0].'</a></li>'; 
    } 
    // Your other code here 
} 

希望有所幫助。

編輯: 你可以改變它們的存儲方式,防止重複使用導航「姓名」,因爲它是下存儲的密鑰,但我已經把它簡單,易於理解。

下面有一個更先進的樣品

function setMenuItem($name, $value) 
{ 
    if(!in_array(array_keys($this->menuItems)), $name) { 
    $this->menuItems[$name] = $value; 
    } else { 
    echo "That's already been added!"; //Handle this properly though 
    } 
} 

然後

function display() 
{ 
     // Your other code here 
     foreach($this->menuItems as $name=>$value) 
     { 
     echo '<li><a href="'.$value.'">'.$name.'</a></li>'; 
     } 
     // Your other code here 
} 
+0

自己的方式並未真正發揮作用,還getMenuItem現在已經不復存在了..是正確的? – Reshad

+0

'getMenuItem'需要更改才能使用此方法。你是什​​麼意思「它不工作」?一個錯誤? (請記住,我打字時沒有錯誤檢查,我可能有錯字,我會仔細看一下) –

+0

我只有'Array'作爲唯一的菜單項。 – Reshad

1

你確實有兩種類型,而不是一個:

  1. MenuItemList
  2. MenuItem

MenuItemList將負責管理列表。它可能使用內部陣列。一個非常相似的代碼示例可以在以前的答案中找到:Array Object In Php

旁邊那display()方法不屬於這兩個。相反,你應該讓你的模板,熱衷它知道如何輸出到菜單列表:

echo '<ul>'; 
foreach ($menu as $item) { 
    echo '<li class="menutitem ', $item->getClass(), '"><a href="index.php?page=', ...; 
} 
echo '</ul>'; 

這也將讓你保持一些程序上的知識,這往往是更直接的與模板,而知道你的菜單模式只是作品並被恰當地封裝。

+0

'MenuItemList :: __ toString()'? –

+0

@MadaraUchiha:可以輸出純文本表示以進行調試,但是您可以爲該menulist創建一個HTML裝飾器,該裝飾器會使用__toString()方法輸出HTML列表。但是menuitems不應該關心它們是如何輸出的,這是代碼的其他部分的作用。 – hakre

0

這樣做:

<?php 
class Navigation implements navigationInterface { 

    public $menu = array(); 
    public $name = null; 
    public $klasse = null; 

    public function __construct($name, $klasse) { 

     $this->name = $name; 
     $this->klasse = $klasse; 

    } 

    public function getName() { 
     return $this->name; 
    } 

    public function getClass() { 
     return $this->klasse; 
    } 

    public function setMenuItem($name , $value) { 
     $this->menu[$name] = $value; 
    } 

    public function getMenuItem($name) { 
     return $this->menu[$name]; 
    } 

    public function display() { 

     if(!empty($this->menu)){ 

      $menu .= "<ul>"; 

      foreach($this->menu as $key => $value){ 
       $menu .= "<li><a href='".$value."'>$key</a></li>"; 
      } 

      $menu .= "</ul>"; 
     } 
     return $menu; 
    } 
} 
?> 

我覺得這是你所需要的

+0

在你的例子中,我只獲得最後的值作爲菜單項 – Reshad

+0

你提到哪個函數? 'getmenuItem()'函數可以通過它的名字獲得每個menuItem,'display()'函數返回所有'menuItems' – Aliweb