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

时间:2018-11-27 09:24:59

标签: php autoload spl-autoload-register

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

如何解决谢谢

2 个答案:

答案 0 :(得分:2)

您的问题是您在Chronometer simpleChronometer = (Chronometer) findViewById(R.id.simpleChronometer); // initiate a chronometer simpleChronometer.start(); // start a chronometer 之前加了

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

  

__DIR__

     

文件目录。 如果在include中使用,则返回包含文件的目录。这等效于dirname(__DIR__)。除非它是根目录,否则该目录名称不带斜杠。

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

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

__FILE__从index.php调用时不会返回__DIR__,而是返回/,这显然导致找不到完成的类路径Module

要么使用另一种在目录之前添加目录的方法,例如使用预定列表,要么使用名称空间的第一部分(因此,请抛开Module/Module/MyClass.php),或者将类移到相对于包含文件所在目录的位置

答案 1 :(得分:1)

您的自动装带器位于Module目录中,因此当您尝试将“ DIR ”附加到类全名时,它将自动附加一个“ 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');