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