新服务器忽略PHP应用程序中的大写

时间:2013-07-01 13:19:25

标签: php apache

我参与了 codeigniter 2.1.3 应用程序,该应用程序是在运行wamp 2.2(php 5.4.3)的 windows上开发的。我最近将应用程序上传到运行apache 2.2.22和php 5.4.6 ubuntu 12.04服务器。

我的模型类的名称类似于billView.php,categoryModel.php等。注意大写字母。 php文件中类的名称也是相同的。从控制器类调用模型时我给出的名称也是一样的。

但是当我在Ubuntu上运行我的应用程序时,我收到此错误

无法找到您指定的型号:billview

从此行抛出错误:

$this->load->model('billView');

(即php忽略大写字母)

当我重命名模型文件(只有模型文件名,类名保持不变)时,错误消失。

如何在不手动重命名所有文件的情况下解决此问题?

3 个答案:

答案 0 :(得分:3)

来自documentation

  

其中Model_name是您的类的名称。班级名称必须具有   首字母大写,其余名称小写。使   确保你的类扩展了基础Model类。

遵循命名约定比解决它更好。

希望这有帮助。

答案 1 :(得分:2)

您遇到的问题是Windows文件系统(NTFS)不区分大小写,因此在Windows中,billview.phpbillView.php是同一个文件。

在Linux上,正如您现在可能猜到的那样,典型的文件系统(ext2 / 3/4,xfs,reiserfs ......)区分大小写,因此billview.phpbillView.php是(或可能是)不同的文件。在你的情况下,一个存在而另一个不存在。

在CodeIgniter自动加载器函数/方法/类/无论如何,它正在尝试require具有您要实例化的类的文件,因此如果您告诉它您需要模型billview,那么将尝试require path/to/model/billview.php;,并且此文件不存在,因此模型不会被加载,然后您的应用程序将失败。

当然,如果Amal Murali建议有一个命名约定,建议遵循命名约定,但这不是问题。如果代码中的所有类,文件和实例具有相同的大小写(无论是all_lowercase,ALL_UPPERCASE,camelCase还是sTuPiD_CaSe),一切都会有效。

因此,请使用与创建它们相同的大小写来引用您的文件/类名,并且类名中的大写应该遵循它所存储的文件名的大小写。

如果您的html代码因同一原因引用不同大小写的文件(图像,css,js文件),则会遇到同样的问题。网络服务器将查找image.jpg但它不存在(例如,现有文件将为Image.JPG。)

在相关的说明中,php中的变量区分大小写,但函数和类不是。尽管如此,请始终使用正确的大写字母来避免问题。

答案 2 :(得分:0)

我个人在CodeIgniter中发现这个约定毫无意义。我不建议破解CodeIgniter核心,但您可以轻松扩展CI_Loader类。这是我的CI版本2.2.0。

<?php

class MY_Loader extends CI_Loader
{
    /**
     * Model Loader
     *
     * This function lets users load and instantiate models.
     * 
     * @param   string  the name of the class
     * @param   string  name for the model
     * @param   bool    database connection
     * @return  void
     */
    public function model($model, $name = '', $db_conn = FALSE)
    {
        if (is_array($model))
        {
            foreach ($model as $babe)
            {
                $this->model($babe);
            }
            return;
        }

        if ($model == '')
        {
            return;
        }

        $path = '';

        // Is the model in a sub-folder? If so, parse out the filename and path.
        if (($last_slash = strrpos($model, '/')) !== FALSE)
        {
            // The path is in front of the last slash
            $path = substr($model, 0, $last_slash + 1);

            // And the model name behind it
            $model = substr($model, $last_slash + 1);
        }

        if ($name == '')
        {
            $name = $model;
        }

        if (in_array($name, $this->_ci_models, TRUE))
        {
            return;
        }

        $CI =& get_instance();
        if (isset($CI->$name))
        {
            show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
        }

        //$model = strtolower($model);

        foreach ($this->_ci_model_paths as $mod_path)
        {
            if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
            {
                continue;
            }

            if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
            {
                if ($db_conn === TRUE)
                {
                    $db_conn = '';
                }

                $CI->load->database($db_conn, FALSE, TRUE);
            }

            if ( ! class_exists('CI_Model'))
            {
                load_class('Model', 'core');
            }

            require_once($mod_path.'models/'.$path.$model.'.php');

            //$model = ucfirst($model);

            $CI->$name = new $model();

            $this->_ci_models[] = $name;
            return;
        }

        // couldn't find the model
        show_error('Unable to locate the model you have specified: '.$model);
    }
}

?>

我所做的就是复制CI_Loader :: model方法然后注释掉这两行

//$model = strtolower($model);
//$model = ucfirst($model);

您所要做的就是将上面的类放在您的application / core /文件夹中,它应该可以工作。