【发布时间】:2014-05-05 10:18:16
【问题描述】:
如果我正确地理解了 SPL Autoloader 的行为,它会在“全局范围”内发挥作用,对吗?如果我们有,比如说,这个代码:
class Autoloader {
protected static $instance = NULL;
public static function get_instance() {
NULL === self::$instance and self::$instance = new self;
return self::$instance;
}
public function init() {
spl_autoload_register(array($this,'autoload'));
}
private function autoload() {
// to the autoload magic
}
}
$autoloader = new Autoloader();
$autoloader->init();
// or
add_action('muplugins_loaded', array(Autoloader::get_instance(),'init'));
...它适用于应用程序的其余部分,或者如果挂钩到 Wordpress 操作,从挂钩开始,对吗?
在我看来,这不是很方便,尤其是如果您在较大的框架(例如 Wordpress)的框架中工作。有没有办法,如何通过以下方式将 SPL Autoload 的范围限制在特定的上下文中:
- 以不同的方式定义 SPL 自动加载?
- 在函数中有一些特定的东西(例如
return false上的名称没有太多某种模式的类)? - 更聪明的东西?
我知道,我可以在autoload() 函数中添加一些条件语句来避免冲突和错误,但这似乎不是很有效。
谢谢!是的,很可能我只是忽略了一些东西。
编辑
通过命名空间模拟目录结构:在 Wordpress 中实际上是不可能的,是吗?如果您追求的是某种沟通和逻辑结构,例如,必须使用的插件和主题。 (@RoyalBg)
找不到文件:如何确定什么时候找不到文件“可以”,什么时候不可以?通过函数的逻辑?在我看来,缩小自动加载器的范围将是更优雅的解决方案。 (@Jon,@Mark Baker)
但如果我很了解您的 cmets,SPL Autoloader 默认会真正“全局”应用。
【问题讨论】:
-
对于
3.是的,有命名空间:-) -
2 也适用,如果一个应用程序中有多个自动加载器,那么 PHP 将遍历所有嵌套的自动加载器,直到自动加载魔法返回非错误
-
@RoyalBg:你能详细说明和/或举一个简单的例子吗?我也试图围绕命名空间进行思考,而 Wordpress 对我来说并不容易。 :)
-
不知道你在这里追求什么。您可以根据需要注册任意数量的自动加载器,只要它们都表现良好,如果它们不想处理特定的类,它们就什么也不做。 PHP 会自动依次尝试每个自动加载器,直到其中一个加载类。
-
@PetrCibulka 我不知道你的实际问题是什么,举个例子,但如果你的类用命名空间很好地定义,它解决了一个目录结构,你永远不会加载错误类,您将在当前命名空间所在的目录树范围内工作。
标签: php wordpress autoload spl-autoload-register