Как избежать строки пространства имен

Новичок в пространстве имен в 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 как переменную для использования в следующей строке?

treyBake 24.07.2019 11:01

Мне нужно загрузить класс через загрузчик, мне нужно добавить пространство имен как переменную или константу в загрузчик позже... поэтому экспериментирую с ним.

Daksh B 24.07.2019 11:04

Почему бы просто не объявить пространство имен namespace \App\Controllers;, а затем $home = new Home;? Или вы можете сделать все за один раз (использование одинарных кавычек означает, что вам не нужно экранировать обратную косую черту), $class = '\App\Controllers\Home\'; $home = new $class();

Qirel 24.07.2019 11:08

Не совсем об экранировании… обратите внимание, что в сообщении об ошибке говорится: «Класс '\App\Controllers\' не найден» — вообще не упоминается Home? Это из-за Приоритет оператора - new имеет самое высокое значение, поэтому то, что вы написали, в основном эквивалентно (new $namespace) . (Home()), и это, конечно, не то, что вам нужно.

misorude 24.07.2019 11:09

Я обновил все это дело, буду рад, если вы снова увидите.

Daksh B 24.07.2019 11:14

Вы используете какой-то фреймворк?

Qirel 24.07.2019 11:14

нет, никаких рамок .... это как бы в доме.

Daksh B 24.07.2019 11:16
Стоит ли изучать 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 и хотите разрабатывать...
0
7
283
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Как можно предположить, вы можете попробовать:

$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();

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