2011-08-08 108 views
0

我不应该使用Index作为CodeIgniter中控制器类的名称吗?我有一个索引控制器,我看到它的方法被多次调用。更具体地说,我总是看到它的index方法被称为第一,不管我是否正在访问应该在那里路由。为什么在CodeIgniter中调用两个控制器方法?

在应用/控制器/ index.php的

class Index extends CI_Controller 
{ 
    public function index() 
    { 
     echo "index"; 
    } 
    public function blah() 
    { 
     echo "blah"; 
    } 
} 

当我访问index/blah,我看到indexblah打印。当我访问index/index时,我看到indexindex。如果我将控制器重命名为其他内容(例如Foo),则没有问题。这是显而易见的解决方法,但任何人都可以告诉我为什么会发生这种情况?我应该将此报告为CodeIgniter的错误吗?

(注:我没有航线configs/routes.php成立;我index.php是笨树之外)

回答

2

为了进一步阐明问题所在,在PHP4中,构造函数是一个与Class具有相同名称的函数。

例如

class MyClass 
{ 
    public function MyClass() 
    { 
     // as a constructor, this function is called every 
     // time a new "MyClass" object is created 
    } 
} 

现在的PHP5的版本(现在笨,因为2.0.x版本的,持有作为系统要求)

class MyClass 
{ 
    public function __construct() 
    { 
     // as a constructor, this function is called every 
     // time a new "MyClass" object is created 
    } 
} 

所以要回答这个地址的问题问题...

我不应该使用Index作为CodeIgniter控制器类的名称吗?

我认为最好不要选择Index作为控制器名称,因为index()函数在codeigniter中有保留的用处。这可能会导致问题取决于您的PHP配置。

+0

谢谢!所以真的,如果你在任何控制器中有一个控制器名称的方法,这将是一个问题。我还在[保留名称列表](http://codeigniter.com/user_guide/general/reserved_names.html)中找到了'index'。 – theazureshadow

2

谁能告诉我为什么发生这种情况?

当你的控制器被实例化时,index作为构造函数被调用。

比较Constructors and DestructorsDocs

为了向下兼容,如果PHP 5无法找到一个给定类__construct()函数,它会被类的名称搜索旧式的构造函数,。 [由我强调]

在你的情况你的控制器没有任何__construct()功能,但具有相同的名称作为类的函数:index。它正在被调用Codeigniter解析并加载,然后实例化您的控制器。

你可以仅仅通过增加构造到控制器解决这个问题:

class Index extends CI_Controller 
{ 
    public function __construct() {} 
    public function index() 
    { 
     echo "index"; 
    } 
    public function blah() 
    { 
     echo "blah"; 
    } 
} 

这种变化之后,它不会再次发生。

我应该将此报告为CodeIgniter的错误吗?

不,实际上没有必要将此报告为错误,这是语言的工作原理,Codeigniter支持PHP 4,它必须保持向后兼容,并且需要提供PHP 4构造函数。 (注:Codeigniter项目文档中,他们需要PHP版本5.1.6或更高版本的服务器支持,但实际代码中内置了PHP 4兼容性,我指的是代码库,而不是文档。)

+1

感谢您的回答。为了完整性,我将parent :: __ construct()添加到构造函数中。 – theazureshadow

0

下面是使用Codeigniter3

require_once 'Base.php'; 
     class Index extends Base 
    { 
     public function __construct() 
     { 
     parent::index(); 
     $classname=$this->router->fetch_class(); 
    $actioname=$this->router->fetch_method(); 

    if($actioname=='index' || $actioname == '') 
    { 
     $this->viewall(); 
    } 
} 
} 

而且viewall()另一种解决方案具有以下

$this->siteinfo['site_title'].=' | Welcome'; 
$this->load->view('templates/header', $this->siteinfo); 
$this->load->view('templates/menu', $this->siteinfo); 
$this->load->view('index/viewall', $data); 
$this->load->view('templates/footer', $this->siteinfo); 

基本控制器完成所有的库和辅助装载整个应用程序这是为什么呢是在默认类

基本上从我对CodeIgniter的短暂理解,有一个默认操作作为索引是错误的。我通过使用$ this-> router-> fetch_method()的结果打印发现了这一点。在我的索引类的构造()中。 CodeIgniter的默认操作是索引,您只能在application/config/routes.php中设置默认控制器,而不是默认操作。

所以我的建议,千万不要用指数()作为默认操作,特别是如果你正在使用指数作为默认控制器

相关问题