PHP自动加载器功能是否也适用于静态方法调用?

时间:2010-01-11 19:55:52

标签: php

我稍微记得autoload使用new语句。现在,当我有几个实用程序类并且我想自动加载这些时怎么样?我只使用静态方法?

像:

MathGuru::calculateFoo($bar);

autoload会在这里加载MathGuru吗?或者我必须手动包含它吗?

6 个答案:

答案 0 :(得分:20)

自动加载机制与使用非静态类的静态类的工作方式完全相同:

  • 您注册的自动加载功能/方法将被称为
  • 它会收到班级的名称
  • 它必须要求/包含必要的PHP代码


实际上,自动加载器甚至不必“知道”它是否被调用来加载静态或动态类,因为它的作用是加载包含类定义的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。因此,如果您的客户端代码需要一个类,因为您想要访问一个静态类成员,并且它还没有加载,那么它会加载它并将其置于游戏中。

然后,逻辑上,应该工作的第一件事是调用静态成员。使用构造函数来实例化对象通常在类加载后发生。因此,静态案例应该首先在你的心中(但是书籍太多而且利用静态类成员不足)。 : - )