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


Can php spl_autoload_register & composer autoloader work together?

经过一点研究,一直无法找到我的问题的解决方案。我正在使用一个API,这是我通过composer下载的名称空间。API依赖于我允许composer为我管理和自动加载。除此之外,我使用php的spl_autoload_register自动加载了大约10个类。最近,我开始混合课程来完成一个项目的一部分,但整个项目都变成了垃圾。我的自定义类不能使用composer类,反之亦然。有没有一种方法可以用来自动加载两个单独文件夹中的类,这些类用两个单独的outloader加载。

这是我目前使用的代码。vender/autoload.php与典型的composer autoloader没有什么不同。感谢您的帮助。

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');

实际上composer使用了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';
    }
}

由于@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');

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

如果这是一个小项目,其中包含来自两个或三个文件夹的文件,则可以使用简单的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 class functions/generaalFunctions.php generaalFunctions class,然后您可以检查名称,如果它有controller,则从controllers文件夹中包括它。在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');