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 header函数分析详解
Aug 06 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
php随机取mysql记录方法小结
Dec 27 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
PHP实现递归无限级分类
Oct 22 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
php微信开发之批量生成带参数的二维码
Jun 26 PHP
PHP实现腾讯与百度坐标转换
Aug 05 PHP
PHP实现防止表单重复提交功能【基于token验证】
May 24 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
PHP chr()函数讲解
Feb 11 PHP
thinkphp5实现微信扫码支付
Dec 23 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
搜索引擎技术核心揭密
2006/10/09 PHP
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
浅谈php的优缺点
2015/07/14 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
利用js对象弹出一个层
2008/03/26 Javascript
EXT中xtype的含义分析
2010/01/07 Javascript
JavaScript检查弹出窗口是否被阻拦的方法技巧
2015/03/13 Javascript
javascript版2048小游戏
2015/03/18 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
iframe中子父类窗口调用JS的方法及注意事项
2015/08/25 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
JS button按钮实现submit按钮提交效果
2016/11/01 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
跟老齐学Python之list和str比较
2014/09/20 Python
python实现朴素贝叶斯算法
2018/11/19 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
加热夹克:RAVEAN
2018/10/19 全球购物
介绍一下gcc特性
2012/01/20 面试题
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
推广普通话标语
2014/06/27 职场文书
合同和协议有什么区别?
2014/10/08 职场文书
先进单位事迹材料
2014/12/25 职场文书
自荐信范文
2019/05/20 职场文书
Django实现翻页的示例代码
2021/05/24 Python