【问题标题】:Cannot call the same static method from identical method from the same class不能从同一类的相同方法调用相同的静态方法
【发布时间】:2012-08-11 15:20:03
【问题描述】:

我的 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);
    }
}
?>

主控制器_菜单:

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

facebook() 方法与 index() 完全一样,但是 index 工作正常,facebook() 抛出这个消息:

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

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

【问题讨论】:

  • 是否包含 MainController 文件?该错误意味着它找不到类,通常是因为脚本中没有包含类文件。
  • 这是整个错误类。 index() 方法中没有其他代码。如果这两个相同,但一个不能调用另一个可以的,那怎么可能?还是 index() 方法是一种特殊的方法?是的,我知道如何包含一些东西,但我的问题是 index() 怎么可能工作???
  • 通常的codeigniter地方application/controllers/main.php
  • 这确实是一个有趣的行为,CI 类加载器应该没有区别(但显然是这样)。我可以建议相反的方式:将您的menu 实现为视图助手?
  • hmm :D 你的意思是整个功能还是如何?我什至在这里问过这个问题:codereview.stackexchange.com/questions/11277/…

标签: php codeigniter error-handling controller


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    因此,也许您的计算机缓存了某些内容,或者您​​在其他地方有一些其他代码让您认为它正在运行。但它不起作用。

    无论如何 - 真正的问题是你为什么要尝试从另一个控制器调用一个控制器?这不是一个好的 MVC 方法。您的“_menu()”函数应该位于library - 那是它所属的地方。

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

    或者将 _menu() 代码放入helper

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

    【讨论】:

    • 迄今为止最好的答案,我检查了一下,也许缓存是原因......另外感谢您的建议,我已经将菜单放入模型中。
    【解决方案4】:

    根据@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,这样就好像我去urlwww.example.com/error/facebook一样,所以main控制器不是已加载,因为仅请求 error/facebook。如果我调用www.example.com/error/index,它的工作原理是一样的,因为在这种情况下,main 控制器没有加载,只有error

    (赏金去了@TheShiftExchange,因为他的回答是最准确的,并为我提供了能够追踪问题的最佳信息。谢谢!
    我的重定向之一从未到达,我坚持称之为错误/索引页面。)

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2016-08-13
      • 1970-01-01
      • 2011-11-24
      • 2011-10-31
      • 1970-01-01
      相关资源
      最近更新 更多