可以php spl_autoload_register&作曲家自动加载器一起工作?

时间:2015-03-24 06:55:54

标签: php composer-php autoload autoloader spl-autoload-register

经过一些研究,无法找到问题的解决方案。我正在使用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');

3 个答案:

答案 0 :(得分:6)

嗯,实际上作曲家使用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';
    }
}

答案 1 :(得分:4)

如果这是一个包含来自两个或三个文件夹的文件的小项目,则可以使用简单的if语句。

function my_autoloader($class) {
    if(file_exists('functions/'.$class.'.php')){
      require 'functions/'$class.'.php';
    } else if(file_exists('vendor/'.$class.'.php')){
      require 'vendor/'.$class.'.php';
    } //add more as needed
}
spl_autoload_register('my_autoloader');

对于较大的应用程序,我建议将类文件和类命名为它们的用途或操作,并按名称将它们放在特定的文件夹中。示例:controllers / userController.php for userController类functions / generalFunctions.php generalFunctions class然后你可以检查名称,如果它有控制器,那么你从控制器文件夹中包含它。在my_autoloader函数或单独的文件中创建一个数组,如。

loadMap.php

return [
   'controller' => 'path/to/controllers/',
   'function' => 'path/to/functions/',
   'helper' => 'path/to/helpers',
   'etc' => 'path/to/etc/'
]

filewithautoloadfunction.php

function my_autoloader($class){
  $loadMap = require 'path/to/loadMap.php';

  foreach($loadMap as $key => $path){
   if(stripos($key, $class){
    require_once $path.$class.'.php';
   }
  }
}

spl_autoload_register('my_autoloader');

答案 2 :(得分:4)

经过进一步的研究,由于@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');

提示:我将__DIR__添加到autoLoader函数内文件路径的开头。