用户
 找回密码
 入住 CI 中国社区
搜索
查看: 8855|回复: 5
收起左侧

[优化] [CI代码解读] $this->load->model() 问题

[复制链接]
发表于 2017-3-9 10:45:40 | 显示全部楼层 |阅读模式
QQ20170309-102902@2x.png
见上图
Home 控制器内加载了 menu目录下的 Menu_model和user/User_model 。 menu/Menu_model 又加载了 role/User_model

此时要注意了。看似 user/User_model  role/User_model 毫无关系。但是出现了冲突。实际user/User_model 并没有被实例化。详细看代码

/system/core/Loader.php

大致324行
PHP复制代码
 
$model = ucfirst($model);  //首先还是CI一贯的大驼峰命名。首字母大写。
 
if ( ! class_exists($model, FALSE))   // 然后判断类是否存在。注意这里:判断是类如果不存在才执行if里面的内容。因为我这3个model内有2个model名字相同。但是目录不同。虽然是这// 样,但他并没有分开。这也是没用命名空间的问题。是一个典型问题。所以在就算在不同的目录。model的名称也不要相同。问题就在这里。下面的代码我也解释下吧。。
{
 
   foreach ($this->_ci_model_paths as $mod_path) // 然后循环下目录位置
   {
      if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))  // 查看这个model的文件在不在。不在就跳出程序了。
      {
         continue;
      }
 
      require_once($mod_path.'models/'.$path.$model.'.php'); // 存在就引用。
 
      if ( ! class_exists($model, FALSE))  // 这个引用后后看了下类名是否存在。不存在就抛出异常了。
      {
         throw new RuntimeException($mod_path."models/".$path.$model.".php exists, but doesn't declare class ".$model);
      }
 
      break;
   }
 
   if ( ! class_exists($model, FALSE)) // 为何要一直判断这个存在不存在。没想通。
   {
      throw new RuntimeException('Unable to locate the model you have specified: '.$model);
   }
}
elseif ( ! is_subclass_of($model, 'CI_Model')) // 如果上述的行为都不存在。那就奇怪了。所以最后看看是不是CI_MODEL里面的子类。如果也不是依旧报异常。
{
   throw new RuntimeException("Class ".$model." already exists and doesn't extend CI_Model");
}
 
$this->_ci_models[] = $name; // 将自定义名称加入模型中
$CI->$name = new $model(); // 实例化对象并且赋值到你自定义的名称上
return $this;  //返回本身
 
复制代码


问题就是这个样子了。有什么问题或者哪里不对的可以留言。

评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

发表于 2017-3-9 11:25:45 | 显示全部楼层
CI3 如果控制器类同名,确实是不行,因为他没有 namespace
 楼主| 发表于 2017-3-9 11:28:32 | 显示全部楼层
Hex 发表于 2017-3-9 11:25
CI3 如果控制器类同名,确实是不行,因为他没有 namespace

是的。所以开了个帖子说明下。话说CI4什么时候发布。发布后有没有北京下线聚会的打算。Hex 大哥
发表于 2017-3-9 11:52:43 | 显示全部楼层
crazyci 发表于 2017-3-9 11:28
是的。所以开了个帖子说明下。话说CI4什么时候发布。发布后有没有北京下线聚会的打算。Hex 大哥 ...

据说今年能发布吧。。。。

今年是 CI 中国建站10周年 按说要搞个活动。。。。
 楼主| 发表于 2017-3-9 14:24:15 | 显示全部楼层
Hex 发表于 2017-3-9 11:52
据说今年能发布吧。。。。

今年是 CI 中国建站10周年 按说要搞个活动。。。。 ...

好吧。咱们有没有官方的群。
发表于 2017-3-9 14:46:00 | 显示全部楼层

本版积分规则