在CodeIgniter中正确使用PHP类

在CodeIgniter中正确使用PHP类,php,codeigniter,Php,Codeigniter,我有一个类AdminMenu,我正在使用它为我的项目上的管理员创建菜单。下面是课堂: class AdminMenu{ public $menu = array( 'Groups and Statuses' => 'groups', 'Members Management' => 'members', 'Book Manager' => 'books', 'Activity Log' => 'acti

我有一个类
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;
    }
}
class管理菜单{
public$menu=array(
“组和状态”=>“组”,
“成员管理”=>“成员”,
“图书管理器”=>“图书”,
“活动日志”=>“活动”,
“测验制作人”=>“测验”,
“其他”=>“其他”
);
公共功能AdminMenu(){
$html=“
  • ”; foreach($此->菜单为$text=>$link){ $html.='
  • '; } $html.='
'; echo$html; } }
如您所见,构造函数正在回送数据,这很好。因此,当我需要管理菜单时,我可以调用
newadminmenu()而且看起来很棒

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

加载库是为了调用构造函数吗?我错了吗?我应该为输出创建不同的函数吗?或者我可以把它放在
库中
并像调用包含的类一样调用它吗


谢谢

CodeIgniter与该方法一起工作。它们在加载时自动实例化类

您应该像这样使用现有实例

$this->adminMenu->foo();
另一方面,不建议从构造函数进行输出。用于建立对象的内部状态,而不是执行操作。将输出移动到可以调用的方法


还有一件事:在PHP中(与Java不同),建议将构造函数命名为
\u construct
,而不是使用类名。请参阅。

CodeIgniter与该方法一起工作。它们在加载时自动实例化类

您应该像这样使用现有实例

$this->adminMenu->foo();
另一方面,不建议从构造函数进行输出。用于建立对象的内部状态,而不是执行操作。将输出移动到可以调用的方法


还有一件事:在PHP中(与Java不同),建议将构造函数命名为
\u construct
,而不是使用类名。请参阅。

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;
    }
}

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

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;
    }
}

我还建议将$menu设置为私有菜单,而不是公共菜单。

+1关于会员隐私。默认情况下,应将成员设置为私有(字段或方法),并仅在需要时才将其设置为受保护或公共。实现隐藏的原则。非常感谢您的帮助。我现在了解了CI类,我将只让我的构造函数构建,而不是输出。谢谢你对私人功能的介绍
\uu construct()
将是公共的,对吗?在非静态、非单例类上,构造函数始终必须是公共的。如果将其设置为私有,则没有外部作用域可以实例化它。在单例模式中,您将有一个
private function\uuu construct()
,然后是一个
public function getInstance()
,它返回私有静态
self:$\u实例
(如果实例化)或设置
self:$\u instance=new\uu CLASS\uuuu()
。非常感谢您对成员隐私的深入了解+1。默认情况下,应将成员设置为私有(字段或方法),并仅在需要时才将其设置为受保护或公共。实现隐藏的原则。非常感谢您的帮助。我现在了解了CI类,我将只让我的构造函数构建,而不是输出。谢谢你对私人功能的介绍
\uu construct()
将是公共的,对吗?在非静态、非单例类上,构造函数始终必须是公共的。如果将其设置为私有,则没有外部作用域可以实例化它。在单例模式中,您将有一个
私有函数\uuu construct()
,然后是一个
公共函数getInstance()
,它返回私有静态
self:$\u实例
(如果实例化)或集
self:$\u instance=new uu CLASS\uuuuu()
。非常感谢您的见解,非常感谢您提供的信息。有趣的是,构造函数名为
\uu construct
。再次感谢汉克斯提供的信息。有趣的是,构造函数名为
\uu construct
。再次感谢