【问题标题】:Codeigniter Class and filename case sensitive on Linux (centos)Linux (centos) 上的 Codeigniter 类和文件名区分大小写
【发布时间】:2016-08-02 15:31:27
【问题描述】:

我遇到了一个区分大小写的问题,我无法理解它。

这就是我的文件结构。我只进入了我正在使用的目录,但实际上我正在使用 CI3 的完整安装。

/application
    ....
    /controllers/
        application_controller.php
    /core/
        MY_Controller.php
        Public_controller.php
    ....
    /models/
        Application_model.php
    ....

类定义语法如下所示:

/application/core/My_Controller.php

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

/application/core/Public_Controller.php

class Public_Controller extends MY_Controller
{
    function __construct()
    {
        parent::__construct();
    }

    // Application logic here...
}

/application/controllers/application_controller.php

class Application_controller extends Public_Controller
{

    public function __construct()
    {
        parent::__construct();
    }

    // Application logic here...
}

阅读文档,我发现我应该将我的类命名为:

Foo_Controller.php

然后我一直(认为)类定义应该与文件名匹配。所以:

class Foo_Controller extends Bar_Controller {
    ....
}

然后我得到一个 500 错误,或者我没有得到任何错误,并且是一个白页。 当我在本地(mac)工作时,一切都很完美。截至目前(使用上面的语法),我至少得到了默认的 codeigniter 404 页面。使用时

error_log(__FILE__); 

在每个班级的顶部,我得到的只是My_Controller.php

感谢您的任何建议!

【问题讨论】:

  • 文件名应该是/application/controllers/Application_controller.php注意大写A

标签: php linux codeigniter


【解决方案1】:

Codeigniter change log

更改了文件命名约定(类文件名现在必须为 Ucfirst其他所有内容均小写)。

所以你的控制器和文件名应该是

  • My_controller(仅 M 大写其余小写)
  • Public_controller
  • Application_controller
  • Foo_controller

我自己不喜欢新的命名约定 CI-2 在这种情况下更好。

注意:

控制器名称 Public_Controller(C 大写)和文件名 Public_controller.php 可能有效,但我更喜欢保持两个名称相同,因此控制器名称应为 Public_controller

【讨论】:

    【解决方案2】:

    正如@jagad89 所说,application_controller.php 的文件名应该是 as the codeigniter upgrade guide specifies: “......必须以类似 Ucfirst 的方式命名,或者换句话说 - 它们必须以大写字母开头。”所以Application_controller.php

    意味着您的所有控制器、模型、库和驱动程序(NOT HELPERS必须以这种方式命名才能在 codeigniter 中使用。

    为了统一起见,您的类定义应与您所说的文件名匹配。

    您应该在日志中看到 500 个错误,至少在 linux 上,/var/log/apache2/error.log 应该有助于您的调试过程。

    【讨论】:

      【解决方案3】:

      我的解决方案 在 /application/core/ 我创建一个 MY_Loader.php(MY_L 的大写)
      我用原始函数“模型”的副本创建了一个类 MY_Loader
      我评论了“$model = ucfirst($model);”这一行

      /application/core/MY_Loader.php 的代码:

      MY_Loader 类扩展 CI_Loader { /*这是来自/system/core/Moader.php的CI_Loader类的函数模型的副本*/ 公共函数模型($model, $name = '', $db_conn = FALSE) { 如果(空($模型)) { 返回$这个; } elseif (is_array($model)) { foreach ($model as $key => $value) { is_int($key) 吗? $this->model($value, '', $db_conn) : $this->model($key, $value, $db_conn); } 返回$这个; } $路径 = ''; // 模型是否在子文件夹中?如果是这样,解析出文件名和路径。 if (($last_slash = strrpos($model, '/')) !== FALSE) { // 路径在最后一个斜杠前面 $path = substr($model, 0, ++$last_slash); // 以及后面的型号名称 $model = substr($model, $last_slash); } 如果(空($name)) { $名称= $模型; } if (in_array($name, $this->_ci_models, TRUE)) { 返回$这个; } $CI =& get_instance(); if (isset($CI->$name)) { throw new RuntimeException('你正在加载的模型名称是已经被使用的资源的名称:'.$name); } if ($db_conn !== FALSE && !class_exists('CI_DB', FALSE)) { 如果($db_conn === 真) { $db_conn = ''; } $this->database($db_conn, FALSE, TRUE); } // 注意:此条件下的所有代码过去只是: // // load_class('模型', '核心'); // // 然而,load_class() 实例化了类 // 缓存它们以备后用,这样可以防止 // MY_Model 是一个抽象类并且是 // 无论如何都是次优的。 if (!class_exists('CI_Model', FALSE)) { $app_path = APPPATH.'core'.DIRECTORY_SEPARATOR; if (file_exists($app_path.'Model.php')) { require_once($app_path.'Model.php'); if (!class_exists('CI_Model', FALSE)) { throw new RuntimeException($app_path."Model.php 存在,但没有声明类 CI_Model"); } } elseif (!class_exists('CI_Model', FALSE)) { require_once(BASEPATH.'core'.DIRECTORY_SEPARATOR.'Model.php'); } $class= config_item('subclass_prefix').'Model'; if (file_exists($app_path.$class.'.php')) { require_once($app_path.$class.'.php'); if (!class_exists($class, FALSE)) { throw new RuntimeException($app_path.$class.".php 存在,但没有声明类 ".$class); } } } //~ $model = ucfirst($model);/*这是我评论的那一行*/ if (!class_exists($model, FALSE)) { foreach ($this->_ci_model_paths as $mod_path) { if ( !file_exists($mod_path.'models/'.$path.$model.'.php')) { 继续; } require_once($mod_path.'models/'.$path.$model.'.php'); if (!class_exists($model, FALSE)) { throw new RuntimeException($mod_path."models/".$path.$model.".php 存在,但没有声明类 ".$model); } 休息; } if (!class_exists($model, FALSE)) { throw new RuntimeException('无法找到您指定的模型:'.$model); } } elseif ( !is_subclass_of($model, 'CI_Model')) { throw new RuntimeException("Class ".$model." 已经存在并且不扩展 CI_Model"); } $this->_ci_models[] = $name; $CI->$name = new $model(); 返回$这个; } }

      【讨论】:

        猜你喜欢
        • 2012-02-03
        • 1970-01-01
        • 2012-06-09
        • 2017-11-08
        • 1970-01-01
        • 2012-03-24
        • 1970-01-01
        • 2019-06-16
        • 1970-01-01
        相关资源
        最近更新 更多