php - 自动加载不适用于静态方法

php - autoload not working with static method

我使用 spl_autoload_register 自动加载 class 就像

我的结构

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

如何解决这个问题谢谢

你的问题是你在前面添加了 __DIR__

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

__DIR__

The directory of the file. If used inside an include, the directory of the included file is returned. This is equivalent to dirname(__FILE__). This directory name does not have a trailing slash unless it is the root directory.

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

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

__DIR__ 在从 index.php 调用时不会 return /Module,使你完成的类路径 Module/Module/MyClass.php 显然可以'找不到。

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

您的自动加载器位于模块目录中,因此当您尝试将“DIR”附加到 class 全名时,它会附加一个额外的 "Module" .文件位置将是这样的:

../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');