【问题标题】:php - autoload not working with static methodphp - 自动加载不适用于静态方法
【发布时间】:2019-04-28 23:59:36
【问题描述】:

我使用 spl_autoload_register 来自动加载类

我的结构

index.php
Module\Autoloader.php
Module\MyClass.php
Test\test.php

index.php 文件中

require_once ("Module\Autoloader.php");
use Module\MyClass;
include 'Test\test.php';

Module\Autoloader.php 文件中

class Autoloader {
        static public function loader($className) {
            $filename = __DIR__."/" . str_replace("\\", '/', $className) . ".php";
            echo $filename.'<br>';
            if (file_exists($filename)) {
                include($filename);
            }
        }
}
spl_autoload_register('Autoloader::loader');

Module\MyClass.php 文件中

namespace Module;
class MyClass {
    public static function run() {
        echo 'run';
    }
}

Test\test.php 文件中

MyClass::run();

但是有错误

Fatal error: Uncaught Error: Class 'MyClass' not found in ..\Test\test.php

如何解决这个问题,谢谢

【问题讨论】:

  • 输出$filename,检查它是否正确并指向现有文件
  • @NigelRen 是但同样的错误
  • 试过spl_autoload_register('loader'); ?
  • @u_mulder 我只是使用要求自动加载编辑我的代码,输出是Module/MyClass.php 但同样的错误
  • 在 test.php 中尝试Module\MyClass::run()

标签: php autoload spl-autoload-register


【解决方案1】:

你的问题是你在前面加上__DIR__

__DIR__ 取决于调用它的文件所在的位置:

__DIR__

文件的目录。 如果在包含中使用,则返回包含文件的目录。 这相当于 dirname(__FILE__)。除非是根目录,否则此目录名称没有尾部斜杠。

http://php.net/manual/en/language.constants.predefined.php

所以因为您的自动加载程序例程位于 ./Module/ 中

__DIR__ 从 index.php 调用时不会返回 /,而是返回 Module,从而使您完成的类路径 Module/Module/MyClass.php 显然无法找到。

要么使用另一种添加目录的方法,例如预先确定的列表,要么使用命名空间的第一部分(所以只需放弃 __DIR__)或将类移动到相对于包含文件所在目录的位置。

【讨论】:

  • 我不这么认为。在我的echo $filename.'&lt;br&gt;'; 行中,它回显正确..\test\Module/MyClass.php,但出现致命错误Fatal error: Uncaught Error: Class 'MyClass' not found in ..\test\Test\test.php
  • 您仍然需要use Module\MyClass 或将其称为Module\MyClass 正确命名的要求不会改变。
  • 抱歉,我不明白,我的use Module\MyClass; 中有index.php 吗?
  • 该别名用于该文件 (index.php) 的上下文中。因此,在 test.php 文件的上下文中,您需要再次发出 use 语句或指定完全分类的名称。 (即使你包含它)
  • 它不一定是多余的,它只是在文件index.php中的代码上下文中使用。您只需要确保 test.php 中的代码也可以通过别名或使用完整的类名访问完全限定名称。
【解决方案2】:

您的自动加载器位于模块目录中,因此当您尝试将“DIR”附加到类全名时,它会附加一个额外的“模块”。文件位置如下所示:

../Module/Module/MyClass.php

尝试将您的自动加载器移动到与 index.php 相同的目录或更改如下:

<?php

class Autoloader {
    static public function loader($className) {
        $filename = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 
            str_replace("\\", DIRECTORY_SEPARATOR, $className) . ".php";

        if (file_exists($filename)) {
            include($filename);
        } else {
            echo "$filename not found!\n";
        }
    }
}
spl_autoload_register('Autoloader::loader');

【讨论】:

  • 我尝试了你的建议,但没有用。我认为MyClass 在我回显..\test\Module/MyClass.php 时已加载b/c,这是正确的路径。但仍然出现致命错误Fatal error: Uncaught Error: Class 'MyClass' not found in ..\test\Test\test.php
猜你喜欢
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
相关资源
最近更新 更多