PHP中的use关键字及文件的加载详解


Posted in PHP onNovember 28, 2016

前言

可能在大家经常使用框架,写一个Controller或者Model的时候,写了好多use,但是并没有写文件加载的代码,就以为use可以进行文件的自动加载了。

详细介绍

其实,现在流行的php框架,都是基于MVC模式的,大量的使用了命名空间,以提高程序的灵活性。那么框架是怎么实现将use关键字所声明的类库对应的脚本文件进行加载的那?

(1):在通过use关键字进行声明类库的声明的时候,并不会进行脚本的加载,而是在脚本文件真正使用到所对应的类库的时候才会进行加载(这就是所谓延迟加载)。

(2):框架一般在初始化阶段,就声明了__autoload()函数或者是spl_autoload_register()函数(一般会在入口文件中进行声明)。在调用通过use声明的类库的时候,会自动的调用上述的函数,将调用的类库名称传递到函数中(这里的类库名称是包括命名空间的全名称)

<?php
namespace Home\Controller;
function __autoload($class_name) { 
 //echo $class_name."<br/>"; 
 require_once ("./".$class_name . ".php");  
}
use Admin\Controller\Index;
new Index; //new Index会触发__autoload()函数,返回Admin\Controller\Index到函数中
?>

(3):框架中定义的__autoload()函数或者是spl_autoload_register()函数在接收到传递过来的类库名称以后,框架会对名称进行处理,分析出类库名称所对应的文件路径,然后进行文件的加载。这里需要注意的是,不同的框架在解析类库名称,分析文件路径的方式是各不一致的,毕竟各自的目录结构是不一样的。

比如说,thinkphp:

/**
  * 类库自动加载
  * @param string $class 对象类名
  * @return void
  */
 public static function autoload($class) {
  // 检查是否存在映射
  if(isset(self::$_map[$class])) {
   include self::$_map[$class];
  }elseif(false !== strpos($class,'\\')){
   $name   = strstr($class, '\\', true);
   if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){ 
    // Library目录下面的命名空间自动定位
    $path  = LIB_PATH;
   }else{
    // 检测自定义命名空间 否则就以模块为命名空间
    $namespace = C('AUTOLOAD_NAMESPACE');
    $path  = isset($namespace[$name])? dirname($namespace[$name]).'/' : APP_PATH;
   }
   $filename  = $path . str_replace('\\', '/', $class) . EXT;
   if(is_file($filename)) {
    // Win环境下面严格区分大小写
    if (IS_WIN && false === strpos(str_replace('/', '\\', realpath($filename)), $class . EXT)){
     return ;
    }
    include $filename;
   }
  }elseif (!C('APP_USE_NAMESPACE')) {
   // 自动加载的类库层
   foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){
    if(substr($class,-strlen($layer))==$layer){
     if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) {
      return ;
     }
    }   
   }
   // 根据自动加载路径设置进行尝试搜索
   foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){
    if(import($path.'.'.$class))
     // 如果加载类成功则返回
     return ;
   }
  }
 }

这里只是举例说明use与文件的自动加载没有关系,不强调各个框架是具体怎么完成自动加载,具体的可以自己看框架代码进行研究。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

PHP 相关文章推荐
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
Apr 02 PHP
php设计模式 Singleton(单例模式)
Jun 26 PHP
深入php多态的实现详解
Jun 09 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 PHP
PHP_Cooikes不同页面无法传递的解决方法
Mar 07 PHP
PHP中的替代语法简介
Aug 22 PHP
PHP处理会话函数大总结
Aug 05 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 #PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 #PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 #PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 #PHP
PHP数组相加操作及与array_merge的区别浅析
Nov 26 #PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 #PHP
PHP 匿名函数与注意事项详细介绍
Nov 26 #PHP
You might like
PHP时间戳使用实例代码
2008/06/07 PHP
php实现数组重复数字统计实例
2018/09/30 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
javascript 数组排序函数
2009/08/20 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
PHP守护进程实例
2015/03/06 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
JS中的hasOwnProperty()和isPrototypeOf()属性实例详解
2016/08/11 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
JS生成随机打乱数组的方法示例
2017/12/23 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python计算书页码的统计数字问题实例
2014/09/26 Python
python 删除非空文件夹的实例
2018/04/26 Python
Python List cmp()知识点总结
2019/02/18 Python
django将数组传递给前台模板的方法
2019/08/06 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
Python txt文件如何转换成字典
2020/11/03 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
应用化学专业本科生求职信
2013/09/29 职场文书
餐饮加盟计划书
2014/01/10 职场文书
教职工代表大会主持词
2014/04/01 职场文书
考试诚信承诺书
2014/05/23 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
居安思危观后感
2015/06/11 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技