Лучшие практики использования пространств имен PHP - PullRequest
6 голосов
/ 29 августа 2011

У меня есть несколько функций общего назначения, которые не имеют смысла ни в одном классе в качестве статических методов.Я хотел бы инкапсулировать их в пространство имен, чтобы не было конфликтов с функциями, определенными в глобальной области видимости.Для моих классов с пространством имен я следую широко распространенному шаблону, где такой класс, как \ My \ Namespaced \ MyClass, существует в My / Namespaced / MyClass.php по пути включения.функции пространства имен должны быть размещены?Прямо сейчас я помещаю их в "functions.php" в каталоге, содержащем классы в том же пространстве имен.Например, \ My \ Namespaced \ myFunction существует в My / Namespaced / functions.php.

Кроме того, есть ли способ загрузить эти функции так же, как классы автоматически загружаются?

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Кроме того, есть ли способ загрузить эти функции так же, как классы автоматически загружаются?

Не для глобальных функций, но если ...

Есть ли лучший способ для размещения функций с именами?

Я бы посчитал использование объектов вместо "лучшей практики", однако мы все знаем, что это не совсем так.

Для глобальных функций нет автозагрузки, вы можете инкапсулировать функции в классы как статические функции, и тогда автозагрузчик начнет действовать. Так что это может быть предложением, однако вы должны четко понимать, какое влияние эти статические функции имеют на ваш общий дизайн.

Так сказать: если вы в порядке с глобальными функциями, то вы можете быть в порядке с глобальными статическими функциями классов. Они сломаются, если вы измените имя класса (как и для любого глобального имени функции), однако вы создали нечто, что может автоматически загружаться и совместимо с вашей схемой именования файлов.

Редактировать: Когда я пишу глобально, я имею в виду полностью определенное имя функции, это то, что начинается с \. См. Правила разрешения имен Документы .

2 голосов
/ 29 августа 2011

К сожалению, для функций нет автозагрузки (потому что разработчики PHP решили так ...), поэтому вы должны подумать о том, как вы получаете функциональные файлы. Например, вы можете использовать для этого функционал (например, importFunction($namespace); он просто сопоставит пространство имен с именем файла и включит файл), или вы можете включить каждый файл, содержащий функции сразу (при запуске или тому подобное).

...