1

我正在练习一些 PHP OOP,因此我正在创建一个类来创建一个简单的导航菜单(将来会扩展)现在我已经构建了这个类,它有点工作.. 有 1 个菜单项很难.. 我不知道怎么做在我的类中使用数组来使用类

<?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

4 回答 4

6
<?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();

?>
于 2012-11-04T17:53:49.753 回答
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>';

这也将允许您保留一些程序知识,这些知识通常更直接地使用模板,同时知道您的菜单模型可以正常工作并且被正确封装。

于 2012-11-04T17:31:26.127 回答
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;
    }
}
?>

我认为这就是你需要的

于 2012-11-04T17:44:43.367 回答
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
}
于 2012-11-04T17:29:50.263 回答