我参与了 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忽略大写字母)
当我重命名模型文件(只有模型文件名,类名保持不变)时,错误消失。
如何在不手动重命名所有文件的情况下解决此问题?
答案 0 :(得分:3)
其中Model_name是您的类的名称。班级名称必须具有 首字母大写,其余名称小写。使 确保你的类扩展了基础Model类。
遵循命名约定比解决它更好。
希望这有帮助。
答案 1 :(得分:2)
您遇到的问题是Windows文件系统(NTFS
)不区分大小写,因此在Windows中,billview.php
和billView.php
是同一个文件。
在Linux上,正如您现在可能猜到的那样,典型的文件系统(ext2 / 3/4,xfs,reiserfs ......)区分大小写,因此billview.php
和billView.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 /文件夹中,它应该可以工作。