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 相关文章推荐
第二节--PHP5 的对象模型
Nov 16 PHP
php购物车实现代码
Oct 10 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 PHP
解析php中的escape函数
Jun 29 PHP
PHP判断远程图片或文件是否存在的实现代码
Feb 20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
让ThinkPHP支持大小写url地址访问的方法
Oct 31 PHP
php blowfish加密解密算法
Jul 02 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
Nov 14 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
php文件后缀不强制为.php的实操方法
Sep 18 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 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
学习使用curl采集curl使用方法
2012/01/11 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
php的curl封装类用法实例
2014/11/07 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
2017/04/15 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
详解PHP PDO简单教程
2019/05/28 PHP
jQuery队列控制方法详解queue()/dequeue()/clearQueue()
2010/12/02 Javascript
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
jquery表单验证插件formValidator使用方法
2016/04/01 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
jQuery表单事件实例代码分享
2016/08/18 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
vue-router跳转页面的方法
2017/02/09 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
微信小程序实现城市列表选择
2018/06/05 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
python采集百度搜索结果带有特定URL的链接代码实例
2019/08/30 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
python爬虫请求头的使用
2020/12/01 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
基于Python 函数和方法的区别说明
2021/03/24 Python
毕业生教师求职信
2013/10/20 职场文书
cf收人广告词大全
2014/03/14 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
2015年教师节活动总结
2015/03/20 职场文书
深入探讨opencv图像矫正算法实战
2021/05/21 Python
TV动画《间谍过家家》公开PV
2022/03/20 日漫