当前位置: 首页 > news >正文

制作网站软件深圳大型网络科技公司

制作网站软件,深圳大型网络科技公司,wordpress 文章版本管理,重庆微信网站制作公司转载地址:http://www.toolmao.com/composer-autoload composer的出现真是让人们眼前一亮,web开发从此变成了一件很『好玩』的事情,开发一个CMS就像在搭积木,从packagist中取出『积木』搭建在自己的代码中,一点一点搭建…

转载地址:http://www.toolmao.com/composer-autoload


composer的出现真是让人们眼前一亮,web开发从此变成了一件很『好玩』的事情,开发一个CMS就像在搭积木,从packagist中取出『积木』搭建在自己的代码中,一点一点搭建出一个属于自己的王国。
从此以后我基本就抛弃了require和include函数,一个项目中,这两个函数只可能出现一次,那就是require '../vendor/autoload.php'
那么,既然抛弃了传统的文件包含方法,我们使用所有类库都将用namespace和composer自带的autoload。可是,我们自己编写的函数库与类库,怎么用composer的方法来自动加载呢?

这就要从composer.json说起,我们需要通过修改这个文件来达到目的。
composer.json相当于是composer的配置文件,这个配置文件中有一个autoload段,比如我的一个项目:

autoload

其中又包含主要的两个选项: files 和 psr-4。
files就是需要composer自动帮我们加载的函数库(不含类),只要在后面的数组中将函数库的文件路径写入即可。
psr-4顾名思义,是一个基于psr-4(http://www.php-fig.org/psr/psr-4/)规则的类库自动加载对应关系,只要在其后的对象中,以 "命名空间": "路径" 的方式写入自己的类库信息即可。
修改完成后,只要执行一下composer update,即可完成对应工作。

之后,我们在项目中,用如下方式即可加载自定义类库:

new \Core\View();

composer的autoload将会自动包含”./core/view.php”,并找到其中的Core命名空间下的View类。

我们来深挖一下,探索一下autoload的原理。
在我们修改完composer.json并执行update后,将会修改./vender/composer/autoload_psr4.php,比如我的某个项目,其中增加了这样一个对应关系:

autoload

这其实就是我刚刚在.json中添加的对应关系,他等于将.josn的配置文件,换成了php的形式。
那么我看到vendor/autoload.php:

<?php// autoload.php @generated by Composerrequire_once __DIR__ . '/composer' . '/autoload_real.php';return ComposerAutoloaderInitff1d77c91141523097b07ee2acc23326::getLoader();

其执行了一个自动生成的类ComposerAutoloaderInitff1d77c91141523097b07ee2acc23326中的getLoader方法。
跟进:

    public static function getLoader(){if (null !== self::$loader) {return self::$loader;}spl_autoload_register(array('ComposerAutoloaderInitff1d77c91141523097b07ee2acc23326', 'loadClassLoader'), true, true);self::$loader = $loader = new \Composer\Autoload\ClassLoader();spl_autoload_unregister(array('ComposerAutoloaderInitff1d77c91141523097b07ee2acc23326', 'loadClassLoader'));$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->register(true);$includeFiles = require __DIR__ . '/autoload_files.php';foreach ($includeFiles as $file) {composerRequireff1d77c91141523097b07ee2acc23326($file);}return $loader;}

可以明显看到,他将autoload_namespaces.php、autoload_psr4.php、autoload_classmap.php、autoload_files.php等几个配置文件包含了进来,并进行了相关处理(setPsr4),最后注册(register)。
那么我们跟进register方法:

    public function register($prepend = false){spl_autoload_register(array($this, 'loadClass'), true, $prepend);}

这函数就一行,但简单明了,直接调用php自带的spl_autoload_register函数,注册处理__autoload的方法,也就是loadClass方法。再跟进loadClass方法:

    public function loadClass($class){if ($file = $this->findFile($class)) {includeFile($file);return true;}}

从函数名字就可以大概知道流程:如果存在$class对应的这个$file,则include进来。
那么进findFile方法里看看吧:

    public function findFile($class){// work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731if ('\\' == $class[0]) {$class = substr($class, 1);}// class map lookupif (isset($this->classMap[$class])) {return $this->classMap[$class];}if ($this->classMapAuthoritative) {return false;}$file = $this->findFileWithExtension($class, '.php');// Search for Hack files if we are running on HHVMif ($file === null && defined('HHVM_VERSION')) {$file = $this->findFileWithExtension($class, '.hh');}if ($file === null) {// Remember that this class does not exist.return $this->classMap[$class] = false;}return $file;}

通过类名找文件,最终锁定在findFileWithExtension方法中。
不过发现了一个小宝藏:在php5.3.0~5.3.2版本下,类名的第一个字符是\的小bug,也许以后挖漏洞会用上。
还是跟进findFileWithExtension方法:

    private function findFileWithExtension($class, $ext){// PSR-4 lookup$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;$first = $class[0];if (isset($this->prefixLengthsPsr4[$first])) {foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {if (0 === strpos($class, $prefix)) {foreach ($this->prefixDirsPsr4[$prefix] as $dir) {if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {return $file;}}}}}// PSR-4 fallback dirsforeach ($this->fallbackDirsPsr4 as $dir) {if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {return $file;}}// PSR-0 lookupif (false !== $pos = strrpos($class, '\\')) {// namespaced class name$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1). strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);} else {// PEAR-like class name$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;}if (isset($this->prefixesPsr0[$first])) {foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {if (0 === strpos($class, $prefix)) {foreach ($dirs as $dir) {if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {return $file;}}}}}// PSR-0 fallback dirsforeach ($this->fallbackDirsPsr0 as $dir) {if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {return $file;}}// PSR-0 include paths.if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {return $file;}}

最终实现将命名空间\类这样的类名,给转换成目录名/类名.php这样的路径,并返回完整路径。
我发现composer的autoload与php自带的spl_autoload,在包含文件时有一点小区别。那就是,spl_autoload会查找.inc类型的文件名,但composer不会。
另外也可以发现,虽然配置文件的名字是autoload_psr4.php,但实际上psr0格式的自动加载也是支持的。二者最大的不同就是psr0中用”_”来代替目录间的”\


http://www.yayakq.cn/news/39875/

相关文章:

  • 工程承包商赚钱吗广州seo排名外包
  • 网站虚拟主持人辽宁省建设工程信息网官网新系统
  • 响应式mvc企业网站源码住房和城乡建设部网站八大员
  • 浙江工信部网站备案查询工程师招聘网站
  • 昆明企业免费建站网站自主制作平台
  • 广东城乡住房建设部网站十大经典营销案例
  • 综合商城网站程序运城网站建设公司有多少钱
  • 美妆网站开发背景宁波网站建设设计公司信息
  • 北京网页设计公司兴田德润团队长春做网站seo的
  • 阿里云服务器上做网站网站备案收费么
  • 西安php网站建设建设银行梅州分行网站
  • 深圳市建设局网站个人开发app能赚多少
  • 中国能源建设股份有限公司新网站重庆网站建设夹夹虫公司
  • 微信红包建设网站手机百度网址大全
  • app电商网站pc蛋蛋网站开发
  • 贵阳建设银行网站开平网站建设
  • 西安网站建设排行榜跨境电商的行业现状
  • 腾讯建站模板做一个属于自己的网站
  • 怎么在土巴兔做网站企业网站seo从哪开始
  • 网站备案资料修改免费域名申请 知乎
  • 网站建设小程序开发seo推广top模板wordpress
  • 关于省钱的网站名字学校网站的系统建设方式
  • 网站推广策略成功的案例个体工商户经营范围做网站
  • 建站之星管理中心常州哪些网站公司做的好
  • 北京市朝阳区网站开发公司电话seo页面优化的方法
  • 各学院二级网站建设通报网络游戏账号id及装备等
  • 校园网网站建设规划书编程软件推荐
  • 罗湖做网站公司盐城网站关键词优化
  • 网站开发毕业任务书云南网站优化排名
  • 广西城乡住房建设部网站微山县建设局官方网站