如何在自动加载中使用file_exists

时间:2018-02-20 23:34:30

标签: php require file-exists spl-autoload-register

我尝试使用spl_autoload_register函数自动加载我的类。我已经得到它的工作,但仍然收到大量这样的警告消息:"警告:include_once(application / models / controller.class.php):无法打开流:没有这样的文件或目录.. "

我知道我需要使用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();


 ?>

我将其更改为此并且现在正在运行,但有更简单/更简洁的方法吗?这似乎有点重复

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

2 个答案:

答案 0 :(得分:1)

使用循环是使其更简洁的方法之一。将所有可能性放入数组中,循环遍历数组,并在包含文件后返回。在这种情况下,找到的第一个项目将被使用。

$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标准并使用作曲家。

答案 1 :(得分:0)

为了解决这些问题,我想枚举一个匿名数组:

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

请注意,如果你把这样的字符串放在一起,那么对于没有前缀的情况,你会有一个双斜线,但这不应该有所作为。 我发现它更具可读性。