设为首页 收藏本站
查看: 798|回复: 0

[经验分享] PHP PSR4自动加载代码赏析

[复制链接]

尚未签到

发表于 2017-12-29 23:50:16 | 显示全部楼层 |阅读模式
第一部分是引入自动加载配置文件

1.入口文件:autoload.php
  里面没什么东西,就是导入ComposerAutoloader主题文件,一般由一个复杂的名字,不过不用担心就是机器随机生成的一个码而已,就是普通的一个类,名字比较长了。
  

require_once __DIR__ . '/composer/autoload_real.php';  

  
return ComposerAutoloaderInitd0a5721608b46fc86f3b980fb0cea37d::getLoader();
  

2.自动加载主题文件:ComposerAutoloaderInitd0a5721608b46fc86f3b980fb0cea37d
  getLoader(){.....}
  这个就是获得自动加载的主方法,这个有点像代加工厂、里面其实只是组装了下,实际的部件在别的类(后面会提到的ClassLoader类),接下来说说getLoader方法做了哪些代加工


  • 把实际干活的小工招进厂->
  

self::$loader = $loader = new \Composer\Autoload\ClassLoader();  


  • 判断了下PHP版本 如果版本大于5.6 就使用闭包绑定的方式去进行绑定自动加载的配置、需要注意的是,这些内容其实都是composer dump-autoload命令生成的 所以修改了composer.json后一定要执行下该命令。下面的代码段就是给各种psr规则都设置进私有变量,闭包居然还可以这么直接搞好犀利的赶脚
  

return \Closure::bind(function () use ($loader) {  $loader->prefixLengthsPsr4 = ComposerStaticInitd0a5721608b46fc86f3b980fb0cea37d::$prefixLengthsPsr4;
  $loader->prefixDirsPsr4 = ComposerStaticInitd0a5721608b46fc86f3b980fb0cea37d::$prefixDirsPsr4;
  $loader->prefixesPsr0 = ComposerStaticInitd0a5721608b46fc86f3b980fb0cea37d::$prefixesPsr0;
  
}, null,>  


  • 如果版本小于5.6就使用原始点的方法,通过setxxx来一个个进行设置自动加载的配置,和上面实现的功能其实一样的,但是代码量就大很多了
  

$map = require __DIR__ . '/autoload_namespaces.php';  
foreach ($map as $namespace => $path) {
  $loader->set($namespace, $path);
  
}
  

  
$map = require __DIR__ . '/autoload_psr4.php';
  
foreach ($map as $namespace => $path) {
  $loader->setPsr4($namespace, $path);
  
}
  

  
$classMap = require __DIR__ . '/autoload_classmap.php';
  
if ($classMap) {
  $loader->addClassMap($classMap);
  
}
  


  • 最后把loader类注册一下
  

spl_autoload_register(array($this, 'loadClass'), true, $prepend);  

第二部分是如何通过类名找到该文件并引入


  • 入口方法:ClassLoader.php中的loadClass(),寻找顺序是 先classMap里找 再PSR4 PSR0 找
  

//>
if (isset($this->classMap[$class])) {
  return $this->classMap[$class];
  
}
  
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
  return false;
  
}
  
if (null !== $this->apcuPrefix) {
  $file = apcu_fetch($this->apcuPrefix.$class, $hit);
  if ($hit) {
  return $file;
  }
  
}
  

  
$file = $this->findFileWithExtension($class, '.php');
  

  
// Search for Hack files if we are running on HHVM
  
if (false === $file && defined('HHVM_VERSION')) {
  $file = $this->findFileWithExtension($class, '.hh');
  
}
  

  
if (null !== $this->apcuPrefix) {
  apcu_add($this->apcuPrefix.$class, $file);
  
}
  

  
if (false === $file) {

  // Remember that this>  $this->missingClasses[$class] = true;
  
}
  

  
return $file;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429540-1-1.html 上篇帖子: PHP进程通信基础 下篇帖子: php一次上传多张图片,html5 multiple的使用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表