Новичок в пространстве имен в php и попытка вызвать фиктивный класс. Вот код ниже
include "App/Controllers/Home.php";
// This code works but I commented it out to try it the otherway
//$home = new \App\Controllers\Home();
$namespace = "\App\Controllers\\";
$home = new $namespace . Home();
$home->index();
Он показывает ошибку
Fatal error: Uncaught Error: Class '\App\Controllers\' not found in C:\xampp\htdocs\namespace\index.php:16 Stack trace: #0 {main} thrown in C:\xampp\htdocs\namespace\index.php on line 16
Я считаю, что я не убегаю от пространства имен правильно, вы можете помочь?
Мне нужно загрузить класс через загрузчик, мне нужно добавить пространство имен как переменную или константу в загрузчик позже... поэтому экспериментирую с ним.
Почему бы просто не объявить пространство имен namespace \App\Controllers;, а затем $home = new Home;? Или вы можете сделать все за один раз (использование одинарных кавычек означает, что вам не нужно экранировать обратную косую черту), $class = '\App\Controllers\Home\'; $home = new $class();
Не совсем об экранировании… обратите внимание, что в сообщении об ошибке говорится: «Класс '\App\Controllers\' не найден» — вообще не упоминается Home? Это из-за Приоритет оператора - new имеет самое высокое значение, поэтому то, что вы написали, в основном эквивалентно (new $namespace) . (Home()), и это, конечно, не то, что вам нужно.
Я обновил все это дело, буду рад, если вы снова увидите.
Вы используете какой-то фреймворк?
нет, никаких рамок .... это как бы в доме.






Как можно предположить, вы можете попробовать:
$namespace = "\\App\Controllers\\";
$classname = $namespace . 'Home';
$home = new $classname();
$home->index();
Вы должны предпочесть использование одинарных кавычек для пространств имен — использование двойных кавычек может привести к некоторым неожиданным эффектам, поскольку некоторые последовательности имеют особое значение, если они заключены в двойные кавычки. С одинарными кавычками вам нужно заботиться только о конце \, так как \' будет работать как экранированный ' и не будет интерпретироваться как конец строки:
$namespace = 'App\Controllers\\';
Но это необычная ситуация, обычно вы используете FQN, поэтому такой проблемы нет:
$className = 'App\Controllers\Home';
$home = new $className();
Или просто используйте ::class - это больше подходит для IDE и SCA:
$className = \App\Controllers\Home::class;
$home = new $className();
и где вам нужен этот класс? Кроме того, почему вы объявляете $namespace как переменную для использования в следующей строке?