首页 > 解决方案 > php - 自动加载不适用于静态方法

问题描述

我使用 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

怎么解决 谢谢

标签: phpautoloadspl-autoload-register

解决方案


你的问题是你预先__DIR__

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

__DIR__

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

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

因此,因为您的自动加载程序例程位于 ./Module/

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

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


推荐阅读