Dav*_*ave 10 php autoload autoloader spl-autoload-register composer-php
经过一些研究,无法找到解决问题的方法.我正在使用API,这是我通过composer下载的命名空间.API让它依赖于我允许作曲家为我管理和自动加载.与此分开,我有大约10个类,我已经使用php自动加载spl_autoload_register.最近,我开始混合这些类来完成一个项目的部分,整个事情已经变成了废话.我的自定义类不能使用作曲家类,反之亦然.有没有一种方法可以用来自动加载两个独立文件夹中的类,并加载两个独立的外载程序.
这是我目前使用的代码.vender/autoload.php与典型的作曲家自动加载器没有什么不同.谢谢你的帮助.
require 'vendor/autoload.php';
require 'functions/general.php';
require 'include/mailgun.php';
function my_autoloader($class) {
require 'classes/' . $class . '.php';
}
spl_autoload_register('my_autoloader');
Run Code Online (Sandbox Code Playgroud)
好吧,实际上作曲家利用spl_autoload_register,所以回答是'是',他们可以.自动加载机制由自动加载器堆栈支持- 基本上,如果在运行一个自动加载器后类没有出现在运行时,则使用下一个,直到堆栈耗尽自动加载器并且PHP报告有关它找不到的类的错误.每次spl_autoload_register调用基本上都会添加新的自动加载器,因此内存中可能会有大量自动加载器.这个故事的主要内容是无法加载类的自动加载器什么都不做,自动加载代码块只是以不采取任何操作结束,因此下一个自动加载器可能负责类加载.您需要实现的唯一事情是检查您的自动加载器它可以处理当前类加载(在要求它足够之前检查该文件是否存在,尽管您应该考虑在命名空间的情况下可能的目录嵌套),并且一切都应该顺利进行未来:
function my_autoloader($class) {
$path = sprintf('classes/%s.php', $class);
if (file_exists($path)) {
require 'classes/' . $class . '.php';
}
}
Run Code Online (Sandbox Code Playgroud)
经过进一步的研究,由于@Etki和@Sarah Wilson都给了我想法,我提出了以下解决方案。谢谢你们的投入。
require 'vendor/autoload.php';
require 'functions/general.php';
require 'include/mailgun.php';
function autoLoader ($class) {
if (file_exists(__DIR__.'/classes/'.$class.'.php')) {
require __DIR__.'/classes/'.$class.'.php';
}
}
spl_autoload_register('autoLoader');
Run Code Online (Sandbox Code Playgroud)
提示:我在autoLoader函数内部的文件路径的开头添加了__DIR__。
| 归档时间: |
|
| 查看次数: |
4374 次 |
| 最近记录: |