在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
。再次感谢