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 相关文章推荐
什么是MVC,好东西啊
May 03 PHP
PHP在字符断点处截断文字的实现代码
Apr 21 PHP
PHP使用数组实现队列
Feb 05 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
PHP与Java进行通信的实现方法
Oct 21 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
使用PHP uniqid函数生成唯一ID
Nov 18 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
PHP中explode函数和split函数的区别小结
Aug 24 PHP
PHPMailer ThinkPHP实现自动发送邮件功能
Jun 10 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 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/07/19 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
JavaScript事件列表解说
2006/12/22 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
js中substr,substring,indexOf,lastIndexOf的用法小结
2013/12/27 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
vue封装swiper代码实例解析
2019/10/08 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
Python实现多进程的四种方式
2019/02/22 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
2019/08/21 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
python如何处理程序无法打开
2020/06/16 Python
python爬虫请求头的使用
2020/12/01 Python
Html5让容器充满屏幕高度或自适应剩余高度的布局实现
2020/05/14 HTML / CSS
巴西网上药房:onofre
2016/11/21 全球购物
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
实习单位接收函模板
2014/01/10 职场文书
小学生元旦感言
2014/02/26 职场文书
2014年保密工作总结
2014/11/22 职场文书
活动主持人开场白
2015/05/28 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
详细分析PHP7与PHP5区别
2021/06/26 PHP