忽略某些文件中的自动加载器

时间:2016-03-07 06:43:12

标签: php

我在下面有这个函数,在将它们注册为new类之前自动加载类。

function __autoload($controller){ 
    $ce = explode('\\', $controller);

    require ROOT . '/app/base/classes/' . 
    end($ce) . '/class.' . 
    end($ce) . '.php';
}

如何忽略这个类的自动加载器?这背后的原因是因为我安装了一个包,而类文件是我的类文件所在的另一个目录...

2 个答案:

答案 0 :(得分:0)

您可以这样做:

function __autoload($controller){ 

 $ce = explode('\\', $controller);

 $ignore=array('class_1', 'class_2');

 if (!in_array(end($ce), $ignore)) {
  require ROOT . '/app/base/classes/' . 
  end($ce) . '/class.' . 
  end($ce) . '.php';
}
}

答案 1 :(得分:0)

在致电require之前,请尝试new OneClass()包含所需课程的包文件。

例如,如果[ROOT]/app/base/classes/OneClass/class.OneClass.php[ROOT]/app/custom/packages/OneClass.php一起,您可以:

require ROOT . '/app/custom/packages/OneClass.php';

$class = new OneClass(); // will be an instance of /app/custom/packages/OneClass.php

但最佳解决方案是使用namespaces,如PSR-0PSR-4建议中所述。

当你使用名称空间,并且你有正确的目录/文件结构/名称,并且你已经在类中正确描述了名称空间:

$my_class = new \app\base\OneClass();

// The same class name without any conflicts
$class_from_package = new \app\custom\packages\OneClass();

我认为这是一种更有用的方法。您将拥有一些逻辑目录/文件结构,它们将反映命名空间结构。如果你想从其他文件夹加载相同的类名,你就可以通过使用带有对应命名空间的完全限定类名来实现它。

使用命名空间可能有点奇怪,如果之前没有使用它们的话。您需要始终支持文件路径和命名空间定义之间的相关性(例如,将类文件移动到另一个文件夹时),但是在使用它之后,您将不再需要关注命名空间而不是支付绑定去户外之前的鞋子。