我在下面有这个函数,在将它们注册为new
类之前自动加载类。
function __autoload($controller){
$ce = explode('\\', $controller);
require ROOT . '/app/base/classes/' .
end($ce) . '/class.' .
end($ce) . '.php';
}
如何忽略这个类的自动加载器?这背后的原因是因为我安装了一个包,而类文件是我的类文件所在的另一个目录...
答案 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-0和PSR-4建议中所述。
当你使用名称空间,并且你有正确的目录/文件结构/名称,并且你已经在类中正确描述了名称空间:
$my_class = new \app\base\OneClass();
// The same class name without any conflicts
$class_from_package = new \app\custom\packages\OneClass();
我认为这是一种更有用的方法。您将拥有一些逻辑目录/文件结构,它们将反映命名空间结构。如果你想从其他文件夹加载相同的类名,你就可以通过使用带有对应命名空间的完全限定类名来实现它。
使用命名空间可能有点奇怪,如果之前没有使用它们的话。您需要始终支持文件路径和命名空间定义之间的相关性(例如,将类文件移动到另一个文件夹时),但是在使用它之后,您将不再需要关注命名空间而不是支付绑定去户外之前的鞋子。