Автозагрузка обязывает указывать namespace у всех классов?

Сегодня я познакомился с функцией spl_autoload_register. Её использование подразумевает два варианта:
  1. Вызывать несколько раз, в качестве аргумента указав функции, подключающие классы из разных директорий
  2. Вызвать один раз, но исходя из того, что каждый класс имеет свой namespace


Собственно, вопросы:
1) С точки стандартов программирования, насколько правильно указывать у каждого класса namespace?
Ведь так можно легко запутаться, да и код начинает содержать символы, которых раньше мог миновать. (Не считая случаи, когда namespace устраняет конфликт имён)

2) Какой подход для использования spl_autoload_register из двух перечисленных является более правильным? С точки зрения тех же стандартов программирования (ООП и PSR), а также опыта из практики, если можно.

PS. PSR-4 говорит:
Полностью определённое имя класса должно иметь следующую структуру: \<ПространствоИмён>(\<ПодпространствоИмён>)*\<ИмяКласса>

Получается, что при использовании автозагрузки в проекте все классы должны содержать пространства имен?
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
php666
@php666
PHP-макака
1) С точки стандартов программирования, насколько правильно указывать у каждого класса namespace?
да, это правильно. Один файл, один класс, который должен лежать в определенном пространстве имен.

2) Какой подход для использования spl_autoload_register из двух перечисленных является более правильным?
Второй. Ибо это стандарт. "Вызывать несколько раз, в качестве аргумента указав функции, подключающие классы из разных директорий" - это когда у тебя мешанина из кода и ты пытаешься всё это натянуть на современные реалии.

Сейчас дефакто композер стандарт, не изобретай велосипед, не стоит заморачиваться на то, что само по себе практически не используется (spl_autoload_register) в проектах.

1. Возьми композер (у меня под виндой phar работает, если запускать через php), инициализируй его у себя в проекте:
php ../composer.phar init

2. Создай в корне директорию в app с именем Test - это будет пространство имен App\Test, туда положи файл Test.php, в котором объяви класс Test с указанием пространства имен namespace App\Test;

3. В файле composer.json допиши:
{
.....
    "autoload": {
        "psr-4": {
            "App\\": ["app/"]
        }
    }
}

где app - будет весь код твоего приложения, те твоих чудо-классов.
Запусти php ../composer.phar dump-autoload

3. Подключи лишь одну строку: require('./vendor/autoload.php');в файл индекса или в те файлы, где нужны классы с автоподгрузкой.

4. Должно получиться это:
5ea45cd48bcdf580929185.jpeg
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
С точки стандартов программирования, насколько правильно указывать у каждого класса namespace?

Других вариантов нет.

Ведь так можно легко запутаться, да и код начинает содержать символы, которых раньше мог миновать.

Это какая-то белиберда на которую я даже не знаю, что ответить. Пространства имён служат для того чтобы не путаться. Про символы вообще непонятно

Какой подход для использования spl_autoload_register из двух перечисленных является более правильным

Второй
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы