Почему подчеркивание преобразуется в разделитель каталогов в стандарте PSR-0?
Стандарт PSR-0 ( https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md) указывает, что подчеркивание в имени класса должно быть преобразовано в разделитель каталогов в соответствующее имя файла.
Мне кажется, что это не очень хорошая идея, так как создает много ошибок, когда кто-то, кто не знает стандарта, невинно использует подчеркивание в имени класса, и внезапно автозагрузчик не может найти класс, и появляются всевозможные странные ошибки (см. эта проблема с переполнением стека, например: ошибка сопоставления Symfony2.1: class_parents ())
Так что, я думаю, должна быть какая-то причина (историческая совместимость с какой-то библиотекой?) Для этой "функции". Мой вопрос: кто-нибудь знает, почему это было введено в стандарт PSR-0?
3 ответа
Символы подчеркивания использовались во времена, когда PHP еще не поддерживал пространства имен. "Правильно" организованный проект следует соглашению о пространстве имен файлов так же, как структура каталогов.
Это просто какое-то общее "правило" для организации файлов в проекте.
Так что если у вас есть структура каталогов:
root
Name
Package
MyClass.php
Люди привыкли делать:
class Name_Package_MyClass {}
Но теперь, когда у нас есть пространства имен, это становится:
namespace Name\Package;
class MyClass { }
Это просто руководство по стилю кодирования, которое гарантирует, что все делают одно и то же.
Итак, что делает PSR-0, так это сопоставляет старый и новый стиль пространства имен с именем файла.
Имейте в виду, что стандарт PSR-0 был написан для нескольких конкретных проектов и не обязательно является лучшим вариантом для вашего собственного проекта. Как говорится на их сайте: "Если другие люди хотят принять то, что мы делаем, они могут это сделать, но это не цель". PSR-0 очень ограничен, я бы не стал использовать его только потому, что другие люди. Подумайте, чего вы на самом деле хотите от своего проекта, и будет ли он полезным для вас.
PHP поддерживает пространства имен начиная с версии 5.3, ранее самым распространенным соглашением было использование подчеркивания в качестве разделителя пространства имен (каталога), например: My_Project_ClassName
был сопоставлен как /path/to/my/My/Project/ClassName
, Я считаю, что обратная совместимость является основной причиной.