require_once: не удалось открыть поток - PullRequest
0 голосов
/ 05 марта 2019

Я читаю на SO и экспериментирую с некоторыми ответами, но мой код не работает: У меня есть два класса: C:\Apache24\htdocs\phpdb\classes\dbconnection\mysqlconnection\MySqlConnection.php и C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\CreateTableDemo.php. В CreateTableDemo у меня есть следующий код:

    namespace utilities\mysqlutilities;
    use dbconnection\mysqlconnection\MySqlConnection as MSC;
    spl_autoload_register(function($class){
        $class = 'classes\\'.$class.'.php';
        require_once "$class";
    });

Я получаю следующее предупреждение:

`Warning: require_once(classes\dbconnection\mysqlconnection\MySqlConnection.php): failed to open stream: No such file or directory in C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\CreateTableDemo.php on line 10`.

Я понимаю предупреждение: скрипт не находит класс пространства имен в той же папке, поэтому я изменил spl_autoload_register, чтобы найти относительный путь: __DIR__."\\..\\..\\classes\\.$class.'.php'. Я получаю

warning: `Warning: require_once(C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\..\..\classes\dbconnection\mysqlconnection\MySqlConnection.php): failed to open stream: No such file or directory in C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\CreateTableDemo.php on line 10`.

Я не могу найти способ направить сценарий к классу пространства имен. Заранее спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

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

namespace utilities\mysqlutilities;
use dbconnection\mysqlconnection\MySqlConnection as MSC;
spl_autoload_register(function($class){
    $exp = explode('classes', __DIR__);
    $base = reset($exp);
    $class = $base."classes".DIRECTORY_SEPARATOR.$class.".php";
    require_once $class;
});
0 голосов
/ 05 марта 2019

Создать автозагрузчик-класс в отдельном файле:

class Autoloader {
    static public function loader($path) {
        $filename = __DIR__.'/classes/'.str_replace("\\", '/', $path).".php";

        if (file_exists($filename)) {
            include($filename);
            $aClass = explode('\\', $path);
            $className = array_pop($aClass);           
            if (class_exists($className)) {
                return TRUE;
            }
        }
        return FALSE;
    }
}
spl_autoload_register('Autoloader::loader');

И включите его в свой индексный файл (или любой другой). Он загрузит все ваши классы пространства имен, расположенные в папке «классы».

require_once '/PATH_TO/autoload.php';

Кстати: хитрость заключается в том, чтобы заменить обратные косые черты на обычные. У меня отлично работает.

РЕДАКТИРОВАТЬ: поместите autoloader.php на тот же уровень, что и ваша папка "classes". : -)

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