资讯专栏INFORMATION COLUMN

composer 自动加载

alighters / 1237人阅读

摘要:自动加载是指在代码中,不需要显式地使用文件路径将类库文件包含进来,便可使用该文件中定义的类库。在里是这样进行配置的按照的规则,当试图自动加载这个时,会去寻找这个文件。最后,只要在项目中你所需要的所有类库都会在适当的时候自动载入。

Composer是PHP中用来管理依赖(dependency)关系的工具。你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装这些依赖的库文件。

自动加载是指在代码中,不需要显式地使用文件路径将类库文件包含进来,便可使用该文件中定义的类库。

PHP的自动加载机制

PHP的自动加载可以使用__autoload()和spl_autoload_register()两种机制,但后一种为主流,原因是:

__autoload()是全局唯一的,如果框架占了这个名字,便会导致框架的用户用不了其它的__autoload()了,包括用户自定义的和其它类库带的。spl_autoload_register()可以注册多个autoload方法,不存在这个问题。

__autoload()是一个函数,在实际使用中,开发者势必要赋予它一些变量(例如class path和class_name => file_path mapping数组)。这就只能靠全局变量了,使用全局变量可不是好的编码习惯。spl_autoload_register()可以将一个Class的某个方法注册为autoload函数,如Symfony的spl_autoload_register(array(self::getInstance(), "autoload"));

Composer的自动加载方式

Composer提供了四种自动加载的方式,分别是PSR-0、PSR-4、生成classmap以及直接包含files。

提到psr-0和psr-4就不得不先了解命名空间,命名空间的详细介绍详见底部《PHP手册:命名空间》[[1]](#php-namespace)。

psr-0方式,要求目录名称和命名空间层层对应,会导致目录结构容易变得比较深。虽然已被官方废弃,但因为主流框架都已实现psr-0,因此composer仍然使用psr-0来向下兼容。

    "autoload": {
         "psr-0": {
             "Foo": "src/",
         }
    }

按照PSR-0的规则,当试图自动加载 "FooBarBaz" 这个class时,那么会去寻找"src/Foo/Bar/Baz.php",最终这个配置也以Map的形式写入生成的vendor/composer/autoload_namespaces.php

psr-4方式,是composer推荐使用的一种方式,也是psr-0的替代方案,因为它更易使用并能带来更简洁的目录结构。在composer.json里是这样进行配置的

    "autoload": {
        "psr-4": {
            "Foo": "src/",
        }
    }

按照PSR-4的规则,当试图自动加载 "FooBarBaz" 这个class时,会去寻找 "src/Bar/Baz.php" 这个文件。psr-4的配置换会被转换成namespace为key,dir path为value的Map的形式,并写入生成的 vendor/composer/autoload_psr4.php 文件之中

另外注意PSR-4和PSR-0的配置里,"Foo"结尾的命名空间分隔符必须加上并且进行转义,以防出现"Foo"匹配到了"FooBar"这样的意外发生。

classmap方式,则是通过配置指定的目录或文件,然后在Composer安装或更新时,它会扫描指定目录下以.php或.inc结尾的文件中的class,生成class到指定file path的映射,并加入新生成的 vendor/composer/autoload_classmap.php 文件中。

    "autoload": {
        "classmap": ["src/", "lib/", "Something.php"]
    }

例如src/下有一个BaseController类,那么在autoload_classmap.php文件中,就会生成这样的配置:
"BaseController" => $baseDir . "/src/BaseController.php"

files方式,就是手动指定供直接加载的文件。比如说我们有一系列全局的helper functions,可以放到一个helper文件里然后直接进行加载

    "autoload": {
         "files": ["src/MyLibrary/functions.php"]
    }

它会生成一个array,包含这些配置中指定的files,再写入新生成的
vendor/composer/autoload_files.php

在composer.json配置完成之后,来到terminal执行
composer install
执行成功之后,composer就会帮你将加载机制创建完备,会得到一个vendor文件夹。

最后,只要在项目中
require "vendor/autoload.php";
你所需要的所有类库都会在适当的时候自动载入。

参考资料

《PHP手册:命名空间》http://php.net/language.names...
《PHP手册:自动加载类》http://php.net/manual/zh/lang...
《细说“PHP类库自动加载”》https://github.com/qinjx/adv_...
《composer设计原理及用法》http://blog.turn.tw/?p=1039
《composer进阶原理:PHP命名空间与PSR-0》http://blog.turn.tw/?p=1122
《PHP管理依赖关系工具Composer的自动加载》http://www.jb51.net/article/5...

原文链接:https://macken.me/article/composer-autoload

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21879.html

相关文章

  • PHP包管理工具--Composer自动加载

    摘要:接触过的同学都知道使用作为项目的包管理工具但是并不是独有的是的包管理工具这两者的关系就像于于一样但是发现真正项目中使用还是比较少的所以这里这里写一遍文章介绍的使用帮助那些对于还是有点模糊的同学此文跟没有任何联系安装的方式就不讲了具体安装方式 接触过Laravel的同学都知道,Laravel使用Composer作为项目的包管理工具.但是Composer并不是Laravel独有的,Comp...

    xiaoqibTn 评论0 收藏0
  • php-composer的安装与使用方法(简化版)

    摘要:中文网系统要求运行需要以上版本。注中的路径为相对于的路径这个时候,你就可以调用你自己编写的函数库或者类库了注本文内容参考了中文网,后续还会更新其它的实用功能 1.简介 Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。《Composer 中文网》 2.系统要求 运行 Composer 需要 PHP 5.3.2+ 以上版本。C...

    mikasa 评论0 收藏0
  • thinkphp源码分析(三)—自动加载篇(Loader的分析)

    摘要:源码分析自动加载系统会调用方法注册自动加载,在这一步完成后,所有符合规范的类库包括依赖加载的第三方类库都将自动加载。是通过加载对应的文件进行注册加载的。 源码分析 自动加载 系统会调用 Loader::register()方法注册自动加载,在这一步完成后,所有符合规范的类库(包括Composer依赖加载的第三方类库)都将自动加载。 系统的自动加载由下面主要部分组成: 1. 注册系统的自...

    Pandaaa 评论0 收藏0
  • php管理依赖关系工具composer学习笔记

    摘要:首先支持下黄老师的视频网站转型这篇的学习笔记也是根据他的视频教程写的,一共十集,讲解的很简单感兴趣的同志们可以上他视频网站购买视频,网站地址放在文末我的博客作用自动安装所需要的模块,自动加载管理项目,发布到网上上去是默认的加载组件地址安装下 首先支持下黄老师的视频网站转型这篇composer的学习笔记也是根据他的视频教程写的,一共十集,讲解的很简单感兴趣的同志们可以上他视频网站购买视频...

    CoyPan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<