1

我有一个类AdminMenu,我用它来为我的项目的管理员创建菜单。这是课程:

class AdminMenu{
    public $menu = array(
        'Groups and Statuses' => 'groups',
        'Members Management' => 'members',
        'Book Manager' => 'books',
        'Activity Log' => 'activities',
        'Quiz Maker' => 'quiz',
        'Other' => 'other'
    );
    public function AdminMenu() {
        $html = "<nav><ul><li><input type='text' id='search' placeholder='Search' /></li>";    
        foreach($this->menu as $text => $link){
            $html .= '<li><a href="'. site_url(array('admin', $link)) .'">'. $text .'</a></li>';
        }
        $html .= '</ul></nav>';
        echo $html;
    }
}

如您所见,构造函数正在回显数据,这很好。所以当我需要管理菜单时,我可以打电话new AdminMenu();,它看起来很棒。

问题是,CodeIgniter 建议将类保存在libraries目录中并像这样调用它:$this->load->library('adminMenu');。问题是,由于某种原因,它在这里调用了构造函数,所以如果我加载它,然后再创建一个 new AdminMenu(),构造函数一共被调用了 2 次,所以我有两个菜单。

加载库是否意味着调用构造函数,我在这里错了吗?我应该为输出创建不同的函数吗?或者我可以把它留在libraries里面,就像一个包含的课程一样称呼它?

谢谢!

4

2 回答 2

4

CodeIgniter 的加载将始终在控制器的本地范围内创建您的类的单个实例。他们就是这样设计的。(我个人不喜欢这种方法。)

因此,如果您要将您的类构建为 CodeIgniter 库,您将希望构造函数只执行构建任务(无论如何在 OO 中都是可取的),并有一个单独的方法来检索菜单。

(或者,您可以直接加载您的类,使用您自己的外部加载,例如通过添加一个 SPL 自动加载器)。

无论如何,尝试这样做:

class AdminMenu
{
    public $menu = array(
        'Groups and Statuses' => 'groups',
        'Members Management' => 'members',
        'Book Manager' => 'books',
        'Activity Log' => 'activities',
        'Quiz Maker' => 'quiz',
        'Other' => 'other'
    );

    public function __construct()
    {
    }

    public function getMenu()
    {
        $html = "<nav><ul><li><input type='text' id='search' placeholder='Search' /></li>";    
        foreach($this->menu as $text => $link){
            $html .= '<li><a href="'. site_url(array('admin', $link)) .'">'. $text .'</a></li>';
        }
        $html .= '</ul></nav>';
        return $html;
    }
}

然后像这样使用它:

$this->load->library('adminMenu');
echo $this->adminMenu->getMenu();

我还建议将 $menu 设为私有而不是公开。

于 2013-05-23T01:23:20.837 回答
2

CodeIgniter 使用单例方法。他们在加载时自动实例化您的类。

你应该使用现有的实例,像这样

$this->adminMenu->foo();

另一方面,不建议从构造函数中进行输出。构造函数旨在构建对象的内部状态,而不是执行操作。将您的输出移动到您可以调用的方法。

还有一件事:在 PHP(与 Java 不同)中,建议您命名构造函数,__construct而不是使用类名。看到这个

于 2013-05-23T01:22:11.747 回答