composer 第7章 自动加载方式 composer 第7章 自动加载方式

2016-11-18

二、五套 PHP非官方规范

  • PSR-0 (Autoloading Standard) 自动加载标准

  • PSR-1 (Basic Coding Standard) 基础编码标准

  • PSR-2 (Coding Style Guide) 编码风格向导

  • PSR-3 (Logger Interface) 日志接口

  • PSR-4 (Improved Autoloading) 自动加载优化标准

二、自动加载

对于第三方包的自动加载,Composer提供了四种方式的支持:

PSR-0 、PSR-4 的自动加载,生成class-map,和直接包含files 的方式。

①、PSR-4 方式

该方式是 composer 推荐使用的一种方式,因为它更易使用并能带来更简洁的目录结构。在 composer.json 里是这样进行配置的:

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

key 和 value 就定义出了 namespace 以及到相应 path 的映射。按照 PSR-4 的规则,当试图自动加载 “Foo\Bar\Baz” 这个 class时,会去寻找 “src/Bar/Baz.php” 这个文件,如果它存在则进行加载。

注意, “Foo\”并没有出现在文件路径中,这是与 PSR-0 不同的一点,如果 PSR-0 有此配置,那么会去寻找 ”src/Foo/Bar/Baz.php” 这个文件。另外注意 PSR-4 和 PSR-0 的配置里,”Foo\” 结尾的命名空间分隔符必须加上并且进行转义,以防出现 ”Foo” 匹配到了 ”FooBar” 这样的意外发生。在 composer 安装或更新完之后,psr-4 的配置换被转换成 namespace 为 key,dir path 为 value 的Map 的形式,并写入生成的 vendor/composer/autoload_psr4.php 文件之中。

②、PSR-0方式

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

这个配置也以 Map 的形式写入生成的 vendor/composer/autoload_namespaces.php 文件之中。

③、Class-map 方式

通过配置指定的目录或文件,然后在 Composer 安装或更新时,它会扫描指定目录下以 .php 或 .inc 结尾的文件中的class,生成class 到指定 file path 的映射,并加入新生成的 vendor/composer/autoload_classmap.php 文件中(前提是目录和文件已经存在,否则 composer 在扫描时会报错)

{
    "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 文件中,以供autoloader 直接进行加载。

阅读 3260