构建库时,我总是提供一个Autoloader处理库自动加载的类.自动加载器的注册方式如下:
require_once 'path/to/PHP-Parser/lib/PHPParser/Autoloader.php';
PHPParser_Autoloader::register();
Run Code Online (Sandbox Code Playgroud)
如果我的库依赖于另一个库,我不确定如何处理它.想象一下,PHPParser取决于a PHPLexer.现在使用库时需要编写:
require_once 'path/to/PHP-Lexer/lib/PHPLexer/Autoloader.php';
PHPLexer_Autoloader::register();
require_once 'path/to/PHP-Parser/lib/PHPParser/Autoloader.php';
PHPParser_Autoloader::register();
Run Code Online (Sandbox Code Playgroud)
如果不仅仅有一个依赖项或依赖项本身具有依赖项,这可能会很快变得混乱.
那么如何处理依赖自动加载呢?
我的一个想法是,库也应该为它的依赖关系处理自动加载,但这感觉不对.另一个想法是根本不提供自动加载器并假设人们使用UniversalClassLoader.虽然这似乎也不正确.
嗯,有几种方法可以解决这个问题,每种方法各有利弊:
对所有库使用通用的PSR-0自动加载器,并在初始化时注册其他项目的位置.
为每个库定义自定义自动加载器.
为每个库实现bootstrap.php(最好由库提供)
require_once '/path/to/lib/dir/bootstrap.php';初始化就个人而言,我使用第三种选择.一个例子是我的CryptLib库中的bootstrap.php文件.要初始化它,只需调用bootstrap.您也可以使用任何PSR-0自动加载器,只是不要调用bootstrap.php,它会正常工作.但是使用bootstrap选项,如果我添加了在启动时注册自身的功能,我可以将它添加到bootstrap.php文件中并自动执行(而不是告诉用户他们需要执行"x,y" ,z"在启动时)......
关于你提到的通用类加载器选项(spl_autoload_register()不带参数调用),我个人不喜欢这个选项.首先,它降低了类名(它违反了PSR-0,我不喜欢它.我已经习惯了区分大小写的类 - >路径映射,现在实际上更喜欢它).其次,它总是使用相对路径,因此它将击败大多数操作码缓存.还有其他问题,但那些是大问题......