php - автозагрузка не работает статическим методом - PullRequest
0 голосов
/ 27 ноября 2018

Я использую 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 голосов
/ 30 ноября 2018

Ваш автозагрузчик находится в каталоге Module, поэтому он добавит дополнительный «Module», когда вы попытаетесь добавить « 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');
0 голосов
/ 30 ноября 2018

ваша проблема заключается в том, что вы добавляете __DIR__

__DIR__ в зависимости от того, где находится файл, из которого он вызывается:

__DIR__

Каталог файла. Если используется внутри include, возвращается каталог включенного файла. Это эквивалентно dirname (__FILE__).У этого имени каталога нет косой черты, если только он не является корневым каталогом.

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

Так как ваша подпрограмма автозагрузчика находится в ./Module/

__DIR__ не вернет / при вызове из index.php, но Module, что сделает ваш готовый путь к классу Module/Module/MyClass.php, который явно не может быть найден.

Либо используйте другой способ добавления каталогаКак и в заранее определенном списке, используйте первую часть пространства имен (поэтому просто выделите __DIR__) или переместите классы в расположение относительно каталога, в котором находится включаемый файл.

...