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

见上图

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
$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;  //返回本身

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

最后修改:2年前 2017-03-09

© 著作权归作者所有

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

GO语言标准库概览

在Go语言五周系列教程的最后一部分中,我们将带领大家一起来浏览一下Go语言丰富的标准库。 Go标准库包含了大量包,提供了丰富广泛的功能特性。这里提供了概览仅仅是...

75960
来自专栏编码前线

Redis命令:scan实现模糊查询

从Redis v2.8开始,SCAN命令已经可用,它允许使用游标从keyspace中检索键。 对比KEYS命令,虽然SCAN无法一次性返回所有匹配结果,但是却规...

52530
来自专栏黄Java的地盘

eventEmitter3源码分析与学习

事件监听在前端的开发过程中是一个很常见的情况。DOM上的事件监听方式,让我们看到了通过事件的方式来进行具体的业务逻辑的处理的便捷。

16210
来自专栏遊俠扎彪

GNU C之圆括号套花括号(表达式中的复合语句)

GNU C对ANSI C做了很多扩展,除比较知名的0长度数组、typeof关键字之类的以外,还有一个比较有意思的,那就是圆括号里面套花括号的复合语句。举例如下:

26370
来自专栏CSDN技术头条

常用 XML 解析技术

现在的软件项目都不是独立的一个项目,都是多系统协调工作。这样的话就涉及到系统间的通讯,通讯就会跟报文传输挂上关系。系统间使用怎样的报文格式进行通讯呢?有的使用固...

14730
来自专栏JetpropelledSnake

Django学习笔记之Django模版系统

14520
来自专栏Java 源码分析

JavaWeb基础

1. XML xml一般就用来存放少量的数据,或者是作为配置文件。 xml的声明<?xml version=”1.0” encoding=”utf-8”?> ...

35550
来自专栏技术博文

php面试题整理

1.禁用COOKIE 后 SEESION 还能用吗? 答:通常服务器端的session是借助于seesion cookie来和客户端交互的。 但如果客户端禁用了...

42480
来自专栏随心DevOps

【实战】如何使用 Python 从 Redis 中删除 4000万 KEY

本文主要涉及 Redis 的以下两个操作和其 Python 实现,目录: SCAN 命令 DEL 命令 使用 Python SCAN 使用 Python DEL...

75280
来自专栏Elson's web

Promise 原理探究

你真的了解Promise吗?对我而言,除了知道如何使用then解决回调地狱以外,其他的还真的一知半解。虽然ES6的generator和ES7的async awa...

67670

扫码关注云+社区

领取腾讯云代金券