【问题标题】:Does the PHP autoloader function also work with static method calls?PHP 自动加载器功能是否也适用于静态方法调用?
【发布时间】:2010-01-11 19:55:52
【问题描述】:

我稍微记得自动加载与new 语句一起使用。现在当我有几个实用程序类并且我想自动加载它们时怎么样?而且我只使用静态方法?

喜欢:

MathGuru::calculateFoo($bar);

自动加载会在此处加载 MathGuru 吗?还是我必须手动包含它?

【问题讨论】:

    标签: php


    【解决方案1】:

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

    • 将调用您注册的自动加载函数/方法
    • 它将接收类的名称
    • 它必须要求/包含必要的 PHP 代码


    实际上,自动加载器甚至不必“知道”它是被调用来加载静态类还是动态类,因为它的作用是加载包含类定义的 PHP 代码——而不是实例化它或任何东西。

    【讨论】:

      【解决方案2】:

      是的,它会触发__autoload

      触发自动加载的不仅仅是“新”——任何对未知类的引用都会这样做。即使像使用 class_exists 这样的东西也会触发自动加载器(这并不总是理想的行为,这就是为什么 class_exists 有第二个参数来禁用自动加载)

      【讨论】:

        【解决方案3】:

        当然最好、最快的方法就是尝试一下?

        从文档中没有提到需要new

        【讨论】:

        • +1 提到了一个非常准确的方法来处理这样的事情:试试看会发生什么:-)
        【解决方案4】:

        我遇到了一个问题,一个非常小的语法错误给出了一条非常不清楚的错误消息,看起来好像 __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
        【解决方案5】:

        通过调用静态方法自动加载类后,我遇到了与原始海报完全相同的问题。我使用的是 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,这似乎是解决方案。

        【讨论】:

          【解决方案6】:

          自动加载器的目标是在需要时加载class。因此,如果您的客户端代码需要一个类,因为您想访问一个静态类成员,但它还没有加载,繁荣,它会加载它并投入使用。

          从逻辑上讲,首先应该起作用的是调用静态成员。使用构造函数来实例化对象通常发生在加载类之后。所以,静态案例应该是你心中的第一件事(但是有太多的书,以至于没有充分利用静态类成员)。 :-)

          【讨论】:

            猜你喜欢
            • 2019-04-28
            • 2017-11-09
            • 2011-01-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-07
            相关资源
            最近更新 更多