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

Как исправить это спасибо

Выведите $filename, проверьте, что это правильный и указывает на существующий файл.

u_mulder 27.11.2018 10:28

@NigelRen да, но та же ошибка

DeLe 27.11.2018 10:31

spl_autoload_register('loader'); пробовали?

Rotimi 27.11.2018 10:35

@u_mulder, я просто редактирую свой код, используя автозагрузку, вывод - Module/MyClass.php, но та же ошибка

DeLe 27.11.2018 10:39

попробуйте Module\MyClass::run() в test.php.

Dormilich 27.11.2018 10:44

@Dormilich такая же ошибка Module/Module/MyClass.php echo и ошибка Fatal error: Uncaught Error: Class 'Module\MyClass' not found

DeLe 27.11.2018 10:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
6
1 317
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

ваша проблема в том, что вы добавляете __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, но будет возвращать Module, что сделает ваш готовый путь к классам Module/Module/MyClass.php, который, очевидно, не может быть найден.

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

я так не думаю. В моей строке echo $filename.'<br>'; он повторяет правильный ..\test\Module/MyClass.php, но получает фатальную ошибку Fatal error: Uncaught Error: Class 'MyClass' not found in ..\test\Test\test.php

DeLe 30.11.2018 03:33

Вам по-прежнему нужен use Module\MyClass или назовите его как Module\MyClass, требование правильного именования не меняется.

Harald Brinkhof 30.11.2018 03:45

извините, но я не понимаю, у меня use Module\MyClass; в моем index.php?

DeLe 30.11.2018 04:00

этот псевдоним используется в контексте этого файла (index.php). Таким образом, в контексте файла test.php вам нужно либо снова выполнить оператор use, либо указать полностью классифицированное имя. (даже если вы его включите)

Harald Brinkhof 30.11.2018 04:08

Кажется, use Module\MyClass; в index.php избыточен, а в Test\test.php должен быть require_once ("Module\MyClass.php"); use Module\MyClass;?

DeLe 30.11.2018 04:18

он не обязательно избыточен, он просто используется в контексте кода в файле index.php. Вам просто нужно убедиться, что код в test.php также имеет доступ к полному имени, либо через псевдоним, либо используя полное имя класса.

Harald Brinkhof 30.11.2018 10:37

Ваш автозагрузчик находится внутри каталога модулей, поэтому он добавит дополнительный «Модуль», когда вы попытаетесь добавить «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 был загружен b / c, когда я повторяю ..\test\Module/MyClass.php, это правильный путь. но все равно получаю фатальную ошибку Fatal error: Uncaught Error: Class 'MyClass' not found in ..\test\Test\test.php

DeLe 30.11.2018 03:30

Другие вопросы по теме