Php не работает namespace

Проблема с пространством имен PHP

Всем привет. пишу проект. Какая-то фигня случилась, или я невнимательный o_O. Хотел сделать контейнер зависимости(DI). И вот проблема. В файле bootstrap.php не видны классы(а конкретно Provider), хотя использую стандартный автозагрузчик, сгенеренный composer-ом. Вот ошибка:

Fatal error: Uncaught Error: Class ‘Engine\Service\Database\Provider’ not found in D:\OSPanel\domains\cms\engine\bootstrap.php:17 Stack trace: #0 D:\OSPanel\domains\cms\index.php(3): require_once() #1 thrown in D:\OSPanel\domains\cms\engine\bootstrap.php on line 17

Структура проекта в картинке внизу(в Core только подключение к БД):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
 require_once __DIR__.'/../vendor/autoload.php'; use Engine\Cms; use Engine\DI\DI; try { //Dependency injection $di = new DI(); $services = require __DIR__.'/Config/Service.php'; //Init services foreach ($services as $service) { $provider = new $service($di); $provider->init(); } $provider->init(); $cms = new Cms($di); $cms->run(); }catch(\ErrorException $e) { echo $e->getMessage(); }
 return [ Engine\Service\Database\Provider::class, ];
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 namespace Engine\Service\Database; use Engine\Service\AbstractProvider; use Engine\Core\Database\Connection; class Provider extends AbstractProvider { /** * @var string */ public $serviceName = 'db'; /** * @return mixed */ public function init() { $db = new Connection(); $this->di->set($this->serviceName, $db); return $this; } public function test() { echo '222'; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 namespace Engine\Service; abstract class AbstractProvider { /** * @var \Engine\DI\DI; * */ protected $di; public function __construct(\Engine\DI\DI $di) { $this->di = $di; } /** * @return mixed */ abstract function init(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
 namespace Engine\DI; class DI { /** *@var array */ private $container = []; /** * @param $key * @param $value * * @return $this */ public function set($key, $value) { $this->container[$key] = $value; return $this; } /** * @param $key * * @return mixed */ public function get($key) { return $this->has($key); } /** * @param $key * * @return bool */ public function has($key) { return isset($this->container[$key]) ? $this->container[$key] : null; } }

Источник

Почему не работает namespace (php)?

$router = new Router;
а не
$router = new Router();
?

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

Напишите ошибку полностью, а не три точки. Есть там что-то вроде expecting? Не имея возможности заглянуть, первое, что приходит на ум — это просто банальная ошибка в синтаксисе подключаемого файла. Незакрытая пара <>, к примеру.

Parse error: syntax error, unexpected 'app' (T_STRING) in /var/www/u0111/data/www/site.ru/app/core/Router.php on line 2

lexstile, и эта ошибка появляется, когда напрямую в браузере localhost/your_path/Router.php вызываете? Т.е. можете сказать подробнее и подтвердить, что файл Router.php содержит в себе

namespace app\core; class Router < function __construct() < echo '1111'; >>

и при обращении к нему появляется эта ошибка?

P.S. какой путь выдает для $_SERVER[‘DOCUMENT_ROOT’]?

Hanneman,
1. Файл Router.php содержит только этот код, 2 строка — как раз namespace.
2. При открытии напрямую файла Router.php — эта же ошибка.
3.

$_SERVER['DOCUMENT_ROOT'] = '/var/www/u0111/data/www/site.ru'

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

Внимательно читаем и удаляем лишние символы перед namespace

lexstile, Скачал ваш архив. Ну так у вас же в Router.php перед объявлением символ табуляции. И в слове namespace вместо английской ‘c’ символ в другой кодировке. Исправьте.
5baf9ad9aca95089441904.png5baf9ae44e063667634509.png
В любом редакторе видно:
5baf9e5dbe22a420329949.png
И ваш файл создан в ANSI (и этот символ не различишь визуально в том же самом Notepad++, пока не Encode in UTF-8 не сделаешь). Здесь вам совет: все файлы создавайте и храните в кодировке Unicode/UTF-8 (пока не потребуется иначе).

P.S. Вы ни разу не скопировали хотя бы разок мой код из комментариев и не запустили? Визуально сравнивали только? 🙂

Табуляция-то роли не играет, а то, что написал другой символ явно не видел.
плакать хочется — спасибо огромное.

Источник

Не работает namespaces в PHP

Все программисты знакомы с проблемой, когда код не работает так, как ожидалось. Одним из таких проблемных моментов может быть неисправность namespaces в PHP. Это может быть особенно раздражающим, когда вы работаете с большими проектами и множеством файлов. Но не отчаивайтесь! В этой статье мы рассмотрим основные причины неисправности namespaces в PHP и как их решить.

Прежде всего, давайте определимся, что такое namespaces в PHP и для чего они нужны. Неймспейс (или пространство имен) — это специальный механизм в PHP, который позволяет управлять областью видимости функций, классов и переменных. Он предотвращает конфликты имен между различными участками кода и делает множество файлов и классов более удобными для работы.

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

Теперь давайте рассмотрим причины, по которым namespaces могут не работать в PHP.

Один из наиболее распространенных вариантов проблемы с namespaces — это синтаксическая ошибка в коде. Давайте рассмотрим пример, когда мы пытаемся использовать именованный пространство имен \MySpace в классе.

 [/code] Если в файле с классом опечатка или другая ошибка синтаксиса в определении пространства имен или имени класса, то PHP не сможет прочитать это и не поймет, какое пространство имен использовать. 2. Неверное использование функций Иногда неисправность namespaces может вызваться из-за неправильного использования функций, относящихся к пространству имен. К примеру, можно попытаться использовать функцию или класс, который не находится в текущем пространстве имен. [code] > namespace NotMyNamespace; $myObj = new MyClass(); $myObj->myMethod();

Тут мы попытались создать экземпляр класса MyClass в пространстве имен NotMyNamespace, но MyClass не находится в этом пространстве имен. В результате мы получим ошибку:

Fatal error: Class 'NotMyNamespace\MyClass' not found in .

4. Использование нескольких пространств имен

Когда в проекте используется несколько пространств имен, то неисправности могут возникать из-за неопределенных или дублирующихся имен. Для того, чтобы избежать этого, необходимо использовать ключевое слово «use», которое помогает связать имя класса с пространством имен.

Теперь, когда мы используем ключевое слово use, мы можем указать, что MyClass находится в пространстве имен NotMyNamespace. Если мы забудем использовать ключевое слово «use», то PHP не сможет использовать этот класс.

В заключение, неисправности namespaces в PHP могут быть вызваны из-за различных ошибок, таких как неправильные настройки, ошибка синтаксиса, работа с различными пространствами имен и т.д. Однако для решения этой проблемы довольно просто: необходимо внимательно анализировать код, получать информацию об ошибках и исправлять их, а также правильно объявлять пространства имен и ссылаться на них внутри кода.

Если вы столкнулись с проблемами namespaces и не можете решить их самостоятельно, посетите форумы и сообщества, где находятся эксперты PHP. Они могут помочь вам решить эту проблему и улучшить работу вашего проекта.

Источник

Читайте также:  Java collection util api
Оцените статью