Проблема с пространством имен 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’ символ в другой кодировке. Исправьте.
В любом редакторе видно:
И ваш файл создан в 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. Они могут помочь вам решить эту проблему и улучшить работу вашего проекта.