Проблема с использованием spl_autoload_register
Делаю сейчас для себя проект, хочу разобраться в автозагрузке и неймспейсах. Есть следующая структура проекта:
- Когда перехожу в тестовый файл где есть такой код:
use App\App;
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
require($_SERVER['DOCUMENT_ROOT'].'/Core/App.php');
$a = new App;
$a::getView('test');
Получаю следующую ошибку
Warning: require_once(/volume1/web/tasks\App\Classes\DB.php): failed to open stream: No such file or directory in /volume1/web/tasks/Core/App.php on line 12 Fatal error: require_once(): Failed opening required '/volume1/web/tasks\App\Classes\DB.php' (include_path='.:/var/packages/PEAR/target') in /volume1/web/tasks/Core/App.php on line 12
Как я подозреваю - проблема в слешах (у меня Win10, сменить на линукс не получится).
- в коде подключения к базе данных при использовании пространства имен получаю эту ошибку. По идее использования автолодера должно было ее решить, нет?
Композером практически не умею пользоваться, хотя читал что эту проблему можно решить с помощью него. Но так как проект не особо большой я хотел бы понять как вообще работает автозагрузка и неймспейсы на практике, не думаю что композер стоит разворачивать ради 5-6 классов, да и не умею особо им пользоваться
Автозагрузка идет в классе App, код ниже
namespace App;
use App\Classes\DB as DB;
use App\Route\Route as Routs;
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
class App{
function __construct(){
spl_autoload_register(function ($class_name) {
require_once ($_SERVER['DOCUMENT_ROOT'].'/'.$class_name . '.php');
});
self::InitDB();
self::InitRouting();
// self::Init();
// self::test();
}
static function InitRouting(){
$route = new Routs;
return $route;
}
static function InitDB(){
$db = new DB;
return $db;
}
static function getView($view){
$r = Routs::base_path_route();
$str = $r['views'].$view;
return $str;
}
}
Ответы (1 шт):
Автор решения: Антон
→ Ссылка
Короче в чем была проблема... По первому пункту @u_mudler подсказал решение:
$str = str_replace("\\", "/", $str);
require_once ($str);
По второму пункту нагуглил объяснение\решение этой проблемы. Надо было обращаться к глобальному пространству имен, то есть
$mysqli = new \mysqli('ccc', 'ccc', 'ccsc', 'ccd'); //correct
$mysqli = new \mysqli('ccc', 'ccc', 'ccsc', 'ccd'); // this not correct if used namespace
