riimu / kit-classloader
兼容PSR-0和PSR-4的类自动加载器
Requires
- php: >=5.6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.3
- phpunit/phpunit: ^5.7 || ^6.2
- squizlabs/php_codesniffer: ^3.0
README
类加载器是一个PHP库,用于自动加载类。类自动加载意味着只有当类实际需要时才加载它们,而不是在每次执行时都必须包含每个类文件。这可以减少页面加载的开销,尤其是在大型网站上,因为只需要加载一些类文件。通常,类也是从基于命名空间和类名的文件名动态加载的。这也使得管理大量类文件更容易。
此库支持当前类自动加载标准的两种,即PSR-0和PSR-4。这些标准背后的基本思想是,类文件位于基于它们命名空间的目录中,并以类的名称命名文件。这两个标准之间的关键区别是PSR-4不需要在目录层次结构中存在整个命名空间。
然而,由于查找实际类文件的操作往往相对昂贵,此库还提供了基本的缓存机制,允许在PHP文件中缓存类文件的位置。有了缓存,自动加载和手动加载文件之间的性能差异变得可以忽略不计。
使用Apigen生成的API文档可以在以下网址在线阅读:http://kit.riimu.net/api/classloader/
要求
- 最低支持的PHP版本是5.6
安装
使用Composer安装
安装此库最简单的方法是使用Composer处理您的依赖关系。为了通过Composer安装此库,只需按照以下两个步骤操作
-
通过在项目根目录运行Composer的命令行安装来获取
composer.phar
。 -
一旦您运行了安装脚本,您应该已经在项目根目录中拥有
composer.phar
文件,并且可以运行以下命令php composer.phar require "riimu/kit-classloader:^4.4"
通过Composer安装此库后,您可以通过包含Composer在安装过程中生成的vendor/autoload.php
文件来加载库。
将库添加为依赖项
如果您已经熟悉如何使用Composer,您还可以通过将以下composer.json
文件添加到您的项目中,并运行composer install
命令来将库添加为依赖项
{ "require": { "riimu/kit-classloader": "^4.4" } }
手动安装
如果您不希望使用Composer加载库,您还可以通过下载最新版本并提取src
文件夹到您的项目中手动下载此库。然后,您可以包含提供的src/autoload.php
文件来加载库类。
用法
ClassLoader
通过分别使用addBasePath()
和addPrefixPath()
方法支持PSR-0和PSR-4标准的自动加载。您不需要理解这些标准就可以使用此库,只需使用最适合您的方法即可。
PSR-0类自动加载
PSR-0 类自动加载定义,类文件必须放置在一个目录树中,该目录树反映了它们的命名空间。例如,类 'Foo\Bar\Baz' 可以位于文件 '/path/to/classes/Foo/Bar/Baz.php'。这种方法通常是放置类文件的最简单方式。
使用 addBasePath()
方法,您可以定义查找类的基目录。要加载上述类,可以使用以下代码
<?php require 'vendor/autoload.php'; $loader = new Riimu\Kit\ClassLoader\ClassLoader(); $loader->addBasePath('/path/to/classes/'); $loader->register(); $obj = new Foo\Bar\Baz();
如果特定目录仅适用于特定命名空间,您可以使用第二个参数定义命名空间。然而,目录仍然需要指向命名空间的基础目录。例如
<?php require 'vendor/autoload.php'; $loader = new Riimu\Kit\ClassLoader\ClassLoader(); $loader->addBasePath('/path/to/classes/', 'Foo\Bar'); $loader->register(); $obj = new Foo\Bar\Baz();
请注意,PSR-0 还指出,类名中的下划线被视为命名空间分隔符(但不是命名空间中的下划线)。因此,即使您的类名为 'Foo\Bar_Baz',上述两个示例仍然有效。即使您的类命名空间使用类名中的下划线定义,您也必须在命名空间参数中使用反斜杠。
PSR-4 类自动加载
与 PSR-0 不同,PSR-4 类自动加载标准不需要将类放置在一个反映整个命名空间的目录树中。相反,命名空间的一部分可以被特定的路径替换。
例如,如果您的类 'Foo\Bar\Baz' 位于文件 '/path/to/Library/Baz.php' 中,您可以使用 addPrefixPath()
注册路径,如下面的示例所示
<?php require 'vendor/autoload.php'; $loader = new Riimu\Kit\ClassLoader\ClassLoader(); $loader->addPrefixPath('/path/to/Library/', 'Foo\Bar'); $loader->register(); $obj = new Foo\Bar\Baz();
这允许更短的目录结构,因为整个命名空间不需要反映在目录树中。也可以省略命名空间参数,在这种情况下,路径将像通过 addBasePath()
添加的路径一样工作,只是类名中的下划线不会被视为命名空间分隔符。
添加多个路径
虽然您可以多次调用路径添加方法,但可以使用数组添加多个路径。这通常使配置更加简单。例如,您可以通过提供一个数组添加多个基础路径
<?php require 'vendor/autoload.php'; $loader = new Riimu\Kit\ClassLoader\ClassLoader(); $loader->addPrefixPath([ '/path/to/classes/', '/other/path/', ]); $loader->register();
或者您可以通过提供一个关联数组来添加特定命名空间的路径,该数组使用数组键定义命名空间
<?php require 'vendor/autoload.php'; $loader = new Riimu\Kit\ClassLoader\ClassLoader(); $loader->addPrefixPath([ 'Foo\Bar' => '/path/to/classes/', 'Other\Namesapace' => ['/other/path/', '/some/other'], ]); $loader->register();
如上述示例所示,您也可以为特定命名空间提供路径列表。
缓存
每次请求都在文件系统中查找类是一种昂贵的事务。强烈建议缓存文件位置,以便它们不需要在每次请求时进行搜索。毕竟,类文件通常不会在文件系统中移动。
这个库通过 FileCacheClassLoader
提供一个非常简单的缓存系统。该类将文件位置存储在一个单独的 PHP 文件中,该文件在每次请求时加载,而不是手动搜索文件。
FileCacheClassLoader
的使用与 ClassLoader
的使用没有太大区别。您只需在构造函数中提供可写缓存文件的路径。该文件将用于存储类位置,并在发现新的类文件时重写。例如
<?php require 'vendor/autoload.php'; $loader = new Riimu\Kit\ClassLoader\FileCacheClassLoader(__DIR__ . '/cache.php'); $loader->addBasePath('/path/to/classes/'); $loader->register();
鸣谢
此库的版权为 (c) 2012-2017 Riikka Kalliomäki。
有关许可和复制信息,请参阅 LICENSE。