我稍微记得autoload使用new
语句。现在,当我有几个实用程序类并且我想自动加载这些时怎么样?我只使用静态方法?
像:
MathGuru::calculateFoo($bar);
autoload会在这里加载MathGuru吗?或者我必须手动包含它吗?
答案 0 :(得分:20)
自动加载机制与使用非静态类的静态类的工作方式完全相同:
实际上,自动加载器甚至不必“知道”它是否被调用来加载静态或动态类,因为它的作用是加载包含类定义的PHP代码 - 而不是实例化它或任何东西。
答案 1 :(得分:6)
是的,它会触发__autoload。
触发自动加载不仅仅是'新' - 任何对未知类的引用都会这样做。即使使用class_exists之类的东西也会触发自动加载器(这并不总是令人满意的行为,这就是为什么class_exists有第二个参数来禁用自动加载)
答案 2 :(得分:5)
当然,最好的,也是最快的方法是尝试一下吗?
从文档中没有提到需要new
。
答案 3 :(得分:0)
我遇到了一个问题,其中一个非常小的语法错误给出了一个非常不清楚的错误消息,其中看起来没有调用__autoload()。
SomeClass:callStaticMethod(); // Doesn't call autoload for "SomeClass"
SomeClass::callStaticMethod(); // Successfully calls autoload for "SomeClass"
PHP奇怪地将单个“:”(而不是正确的双“::”)解释为什么。它将callStaticMethod()视为全局方法调用,这意味着它会跳过__autoload。
答案 4 :(得分:0)
在通过调用静态方法无法自动加载类之后,我得到了与原始海报完全相同的问题。我使用的是PHP 5.3.5,并提出了以下解决方案。
function autoload($class_name) {
$directories = array(
'php/classes/',
'php/vendor/'
);
foreach ($directories as $directory) {
if (file_exists($directory . $class_name . '.php')) {
require_once($directory . $class_name . '.php');
return;
}
}
}
spl_autoload_register('autoload');
注意:已使用spl_autoload_register
函数代替__autoload
,这似乎是解决方案。
答案 5 :(得分:0)
自动加载器的目标是在需要时加载class
。因此,如果您的客户端代码需要一个类,因为您想要访问一个静态类成员,并且它还没有加载,那么它会加载它并将其置于游戏中。
然后,逻辑上,应该工作的第一件事是调用静态成员。使用构造函数来实例化对象通常在类加载后发生。因此,静态案例应该首先在你的心中(但是书籍太多而且利用静态类成员不足)。 : - )