【发布时间】:2010-01-11 19:55:52
【问题描述】:
我稍微记得自动加载与new 语句一起使用。现在当我有几个实用程序类并且我想自动加载它们时怎么样?而且我只使用静态方法?
喜欢:
MathGuru::calculateFoo($bar);
自动加载会在此处加载 MathGuru 吗?还是我必须手动包含它?
【问题讨论】:
标签: php
我稍微记得自动加载与new 语句一起使用。现在当我有几个实用程序类并且我想自动加载它们时怎么样?而且我只使用静态方法?
喜欢:
MathGuru::calculateFoo($bar);
自动加载会在此处加载 MathGuru 吗?还是我必须手动包含它?
【问题讨论】:
标签: php
自动加载机制对静态类的工作方式与对非静态类的工作方式完全相同:
实际上,自动加载器甚至不必“知道”它是被调用来加载静态类还是动态类,因为它的作用是加载包含类定义的 PHP 代码——而不是实例化它或任何东西。
【讨论】:
是的,它会触发__autoload。
触发自动加载的不仅仅是“新”——任何对未知类的引用都会这样做。即使像使用 class_exists 这样的东西也会触发自动加载器(这并不总是理想的行为,这就是为什么 class_exists 有第二个参数来禁用自动加载)
【讨论】:
当然最好、最快的方法就是尝试一下?
从文档中没有提到需要new。
【讨论】:
我遇到了一个问题,一个非常小的语法错误给出了一条非常不清楚的错误消息,看起来好像 __autoload() 没有被调用。
SomeClass:callStaticMethod(); // Doesn't call autoload for "SomeClass"
SomeClass::callStaticMethod(); // Successfully calls autoload for "SomeClass"
PHP 奇怪地将单个“:”(而不是正确的双“::”)解释为空。它将 callStaticMethod() 视为全局方法调用,这意味着它会跳过 __autoload。
【讨论】:
SomeClass 解释为对不存在的全局变量的引用,并将: 解释为代码块的开始。就像你要去foreach():。
: 是 PHP 标签符号,如果这样使用的话。所以SomeClass:callStaticMethod() 将被解释为一个名为callStaticMethod 的全局函数,紧跟在一个名为SomeClass 的标签之后。标签用于 PHP goto 关键字:) us2.php.net/goto
通过调用静态方法自动加载类后,我遇到了与原始海报完全相同的问题。我使用的是 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,这似乎是解决方案。
【讨论】:
自动加载器的目标是在需要时加载class。因此,如果您的客户端代码需要一个类,因为您想访问一个静态类成员,但它还没有加载,繁荣,它会加载它并投入使用。
从逻辑上讲,首先应该起作用的是调用静态成员。使用构造函数来实例化对象通常发生在加载类之后。所以,静态案例应该是你心中的第一件事(但是有太多的书,以至于没有充分利用静态类成员)。 :-)
【讨论】: