Ошибка регистра автозагрузки spl - PullRequest
0 голосов
/ 25 июня 2018

Я пишу некоторые классы, которые хочу загрузить, используя функцию spl_autoloader_register().Я создал файл с именем autoloader.php и сохранил его в папке, где я сохраняю все классы, необходимые для моего проекта.Итак, чтобы проверить, работает ли он, я загрузил его, используя require_once внутри тестовой php-страницы, но, к сожалению, в журнале консоли отображается сообщение об ошибке PHP Warning: include_once(lib\DataManager.php): failed to open stream: No such file or directory.

Тестовый файл находится внутри того же самогопапка, на которой размещены все классы, это ошибка из-за этой мотивации?

Вот код автозагрузчика

<?php 
function autoloader($className){
    include_once($className . '.php');
}

spl_autoload_register('autoloader');

?>

, и вот как я пытался создать его экземпляр с тестовой страницы

<?php

require_once 'autoloader.php';
require_once 'config.php';

use lib\DataManager as DataManager;

$dataManager = new DataManager($db);

?>

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Относительные пути обрабатываются не относительно файла, в который они записаны, а скорее как «текущий рабочий каталог» процесса PHP (часто это корень документа вашего веб-процесса, но на него не стоит полагаться).

Чтобы сослаться на местоположение текущего исходного файла, PHP предоставляет две магические константы :

  • __FILE__ - полное имя файла любого исходного файла, в который вы его записываетев
  • __DIR__ - это каталог, содержащий этот файл

Итак, если ваши классы находятся в том же каталоге, что и определение вашей функции автозагрузчика, вы можете написать это:

function autoloader($className){
    include_once __DIR__ . DIRECTORY_SEPARATOR . $className . '.php';
}

__DIR__ разрешается один раз, когда функция компилируется, поэтому всякий раз, когда эта функция запускается, она всегда будет ссылаться на каталог, где была определена эта функция , независимо от того, гдеон был вызван или как выполняется скрипт.

(Обратите внимание, что include, require, include_once и require_once являются ключевыми словами, а не функциями, и не нуждаются в скобках.и ихДобавление их в целом не повредит, но в некоторых случаях может привести к путанице, поэтому лучше избегать.)

0 голосов
/ 25 июня 2018

Вы поняли это почти правильно.Проблема в том, что он не указывает на правильную локальную файловую систему, чтобы найти файл.Следующий автозагрузчик будет работать с относительной моделью плагина и моделью папки библиотеки.Это предполагает, что в вашем файле конфигурации вы определили переменную $GLOBALS['config']->lib, которая определяет папку файловой системы, которая может содержать дополнительные системные библиотеки.Конечно, это может быть определено по-разному, это зависит от приложения.

<?php 
function autoloader($className){
    $paths=[getcwd(),$GLOBALS['config']->lib];
    foreach($paths as $p){
        $filename = str_replace('\\','/',$p.'/'.$className.'.php');
        if (is_readable($filename)) {
            require_once($filename);
            return;
        }
    }
}
spl_autoload_register('autoloader');
?>

Это будет работать с учетом двух сценариев, класс относится к последнему запрошенному сценарию, если не пытается предопределенная папка с классами.После того, как он найден и загружен, он должен вернуться, чтобы избежать попыток загрузки других путей.

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

Этот скрипт должен работать на PHP 5.4 и выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...