PHP use namespace\class не работает в подключаемых файлах

119
17 февраля 2021, 21:30

У меня есть класс Core\Router, который нужно использовать и в index.php, и в подключаемом файле routes.php. И хотелось бы писать use только в index.php, но тогда пишет, что класс Router не найден в файле routes.php (Fatal error: Uncaught Error: Class 'Router' not found ). Код файла routes.php:

<?php
Router::get('/', function () {
    echo "Hello world!";
});

Код файла index.php:

<?php
require "core/router.php";
use Core\Router;
Router::set_folder('app/views/');
require "routes.php";

Можно ли записывать use в один файл, чтобы он работал и в подключаемых? Потому что код работает, если я напишу use и в routes.php.

Не очень хочется повторять use Core\Router, если будет много файлов, которые будут использовать этот класс.

Answer 1

Простой ответ: нет, нельзя.

Но кажется, вы немного запутались. use нужен для того, чтобы в текущем нэймспейсе можно было использовать псевдоним имени класса. Например у вас есть нэймспейс \ и \Core\, а в \Core\ есть класс Router. Чтобы в \ можно было писать просто Router, нужно импортировать имя, добавив use Core\Router. То есть use просто позволяет вам в начале объявить, что ниже под Router имеется ввиду \Core\Router. На мой взгляд, это довольно вредная возможность, так как она прячет от программиста бардак в нэймспейсах. Однако фичей широко пользуются, а популярные IDE автоматически добавляют use.

Чтобы не писать каждый раз use Core\Router, используйте Router только внутри нэймспейса \Core. А если он у вас глобальный, то переместите его в корневой нэймспейс \ (уберите объявление нэймспейса в файле класса Router) и пишите \Router. Но скорее всего вам не нужен глобальный Router, а много файлов, использующих его, говорят об архитектурных проблемах.

  • Убедитесь, что хорошо понимаете идею нэймспейсов.
  • Не создавайте лишних нэймспейсов просто потому что вам нравится создавать папки.
  • Обратите внимание, что в некоторых других языках программирования есть возможность объявлять классы приватными (доступными только внутри пакета). Для доступа к возможностям роутинга, возможно нужен интерфейс (фасад) \Core\App::route().
  • По возможности воздержитесь от глобальных состояний. Дёргать статические методы, которые создают скрытый контекст, не самый лучший способ программировать :-)

Если вы используете готовые библиотеки или фрэймворки и вам просто лень писать навязанный ими бойлерплейт (повторяющийся код, не относящийся к сути вашей задачи), то используйте IDE. Современный редактор всё напишет за вас.

READ ALSO
/index.php/news - что это?

/index.php/news - что это?

допустимы ли ссылки такого типа:

136
Installing laravel/laravel (v5.8.17) [ErrorException] mkdir(): Invalid path

Installing laravel/laravel (v5.8.17) [ErrorException] mkdir(): Invalid path

Я только начинаю разбираться не судите строго

119
Декодирование ответа сервера (сокет)

Декодирование ответа сервера (сокет)

Задача: есть сокет, через него отправляю запросы и получаю ответыИзначально он был написан на php, но мне надо переделать его на python

97
pgsql.so не подключается

pgsql.so не подключается

народ! Прошу помощи, никак не получается подключить библиотеку pgsqlso и pdo_pgsql

107