在PHP类中使用Array

时间:2012-11-04 17:24:16

标签: php class

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

这样的类
<?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 个答案:

答案 0 :(得分: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();

?>

答案 1 :(得分:1)

你实际上有两种类型,而不是一种:

  1. MenuItemList
  2. MenuItem
  3. 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>';
    

    这也可以让你保留一些程序性知识,这些知识通常更加直接的模板,同时知道你的菜单模型正常工作并且被正确封装。

答案 2 :(得分: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
}

答案 3 :(得分: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;
    }
}
?>

我认为这就是你需要的