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调用Java对象的方法
Oct 09 PHP
PHP无敌近乎加密方式!
Jul 17 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
Jun 21 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
php判断字符串在另一个字符串位置的方法
Feb 27 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 PHP
php提交post数组参数实例分析
Dec 17 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
PHP 布尔值的自增与自减的实现方法
May 03 PHP
php的命名空间与自动加载实现方法
Aug 25 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
PHP连接SQLServer2005的方法
2015/01/27 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
关于COOKIE个数与大小的问题
2011/01/17 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
JavaScript判断文件上传类型的方法
2014/09/02 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
完美解决input[type=number]无法显示非数字字符的问题
2017/02/28 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
VUE利用vuex模拟实现新闻点赞功能实例
2017/06/28 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
vue实现简单的MVVM框架
2018/08/05 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
node命令行工具之实现项目工程自动初始化的标准流程
2019/08/12 Javascript
js实现录音上传功能
2019/11/22 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
python错误处理详解
2014/09/28 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
高中学生干部学习的自我评价
2014/02/21 职场文书
廉政教育的心得体会
2014/09/01 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
2016新年致辞
2015/08/01 职场文书
CAD实训总结范文
2015/08/03 职场文书
vue首次渲染全过程
2021/04/21 Vue.js