不能从同一个类的相同方法调用相同的静态方法

时间:2012-08-15 10:07:13

标签: php codeigniter error-handling controller

我的Codeigniter 2.1.0应用程序中有这个错误控制器:

<?php

class Error extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        set_status_header(404);
        $data->menuItems = Main::_menu();
        $data->title = "404 error !";
        $data->pageview = 'templates/404';
        $this->load->view('templates/main', $data);
    }

    public function facebook()
    {

        set_status_header(404);            
        $data->menuItems = Main::_menu();
        $data->title = "Facebook error !";
        $data->pageview = "templates/facebook_error";
        $this->load->view('templates/main', $data);
    }
}
?>

主控制器_menu:

<?php
class Main extends CI_Controller
{
    // ...  a lot of methods here ...
    public static function _menu()
    {
            static $menuItems = array( //just a simple array
                                     );
    }
}
?>

facebook()方法与index()完全相同,但索引工作正常,facebook()抛出此消息:

Fatal error: Class 'Main' not found in /var/www/MYApplicationName/application/controllers/error.php on line 22

地球是如何可能的?如何从facebook()方法到达Main::_menu()

4 个答案:

答案 0 :(得分:1)

从另一个控制器调用函数会破坏MVC并将您置于HMVC领域。

如果您确实需要这样做,请查看this thread以及CodeIgniter的Modular Extensions (HMVC) Plugin

答案 1 :(得分:1)

为什么不创建MY_Controller,它扩展了您放置可重用代码的CI_Controller?

答案 2 :(得分:1)

实际上 - 你错了。您的“索引”代码也不起作用。

我只是将上面的所有代码粘贴到CI 2.1.2的干净版本中,索引函数ALSO返回相同的错误。

所以也许你的计算机有缓存的东西,或者你在其他地方有一些其他的代码让你认为它正在运行。但它不起作用。

无论如何 - 真实问题是你试图从另一个控制器调用控制器的原因?这不是一个好的MVC方法。您的“_menu()”函数应位于library - 它所属的位置。

或者将_menu()代码放入“MY_Controller”并让两个控制器都扩展MY_Controller

或者将_menu()代码放入helper

基本上有三种更好的方法可以解决这个问题。

答案 3 :(得分:1)

基于@TheShiftExchange的回答,我能够找到路由设置导致此行为。我的config/routes.php看起来像这样:

$route['404_override'] = 'error/index';
$route['(:any)'] = "main/$1";

所以,当我向www.example.com/nonexistent-url提出main控制器的请求时,CI发现没有这样的方法,所以它也运行error/index,但是那时已加载main控制器。

另一种方法facebook仅从main的现有方法重定向,例如gallery,这就像我去了网址www.example.com/error/facebook一样,因此未加载main控制器,因为只请求了error/facebook。如果我调用www.example.com/error/index它的工作方式相同,因为在这种情况下,main控制器未加载,只加载error

(赏金归@ShiftExchange,因为他的答案是最准确的,并为我提供了能够追踪问题的最佳信息。谢谢!
我的一个重定向从未到达,我应该调用错误/索引页面。)