如何使用 file_exists 自动加载

How to use file_exists with autoload

我正在尝试使用 spl_autoload_register 函数来自动加载我的 类。我已经让它工作了,但我仍然收到大量这样的警告消息:"Warning: include_once(application/models/controller.class.php): failed to open stream: No such file or directory in..."

我知道我需要使用 file_exists 方法以某种方式解决此问题,但不确定如何将其包含在我的代码中:

    <?php

function myLoad($class) {
  include_once('application/controllers/'.$class.'.class.php');
  include_once('application/models/'.$class.'.class.php');
  include_once('application/'.$class.'.class.php');

}

spl_autoload_register('myLoad');

  new controller();


 ?>

我把它改成了这个,现在可以用了,但是有没有 easier/more 简洁的方法来做到这一点?好像有点重复

function myLoad($class) {

  if (file_exists('application/controllers/'.$class.'.class.php')){
    include_once('application/controllers/'.$class.'.class.php');
  }
  if (file_exists('application/models/'.$class.'.class.php')){
    include_once('application/models/'.$class.'.class.php');
  }
  if (file_exists('application/'.$class.'.class.php')){
    include_once('application/'.$class.'.class.php');
  }
}

spl_autoload_register('myLoad');

使用循环是使它更简洁的方法之一。把所有的可能性放到一个数组中,遍历数组,一旦包含一个文件就return。在这种情况下,将使用找到的第一项。

$paths = [
  'application/controllers/'.$class.'.class.php',
  'application/models/'.$class.'.class.php',
  'application/'.$class.'.class.php'
];

foreach($paths as $path) {
   if (file_exists($path)) {
      include_once($path);
      return;
   }
}

但是,与其构建您自己的自动加载器,我建议您查看 PSR-4 标准并使用 composer。

为了解决这类问题,我喜欢枚举匿名数组:

function myLoad($class) {
  foreach(['controllers', 'models', ''] as $prefix) {
    if(file_exists("application/$prefix/$class.class.php"))
      include_once("application/$prefix/$class.class.php");
  }
}

spl_autoload_register('myLoad');

请注意,如果您这样放置字符串,则在没有前缀的情况下会有双斜线,但这应该没有什么区别。 我发现它更具可读性。