Я недавно начал использовать пространства имен в PHP. Когда я впервые увидел их, я подумал, что их синтаксис уродлив, и я никогда не буду их использовать. Тем не менее, я создал автозагрузчик (spl_autoload_register), который делает его таким, чтобы мне больше никогда не приходилось писать оператор include / require.
Мне нравятся пространства имен, но есть ли какая-то объективная выгода по сравнению с операторами include / require, или это один и тот же метод для достижения той же цели?
new \Vendor\Namespace\Class()
без оператора require ранее в методе или классе.Ответы:
Пространства имен предназначены не только для автозагрузки классов. Они также предотвращают конфликты имен. На самом деле, это их основная цель.
Скажем, у вас есть проект, которому нужен класс с именем
User
для хранения информации о пользователях вашего приложения, но плагин также использует (другой) класс с именамиUser
для хранения информации. Пространства имен позволяют вам создать свой класс в одном пространстве имен (скажем,MyApp
) и позволить плагину использовать другое пространство имен (скажем,CoolPlugin
). Код вMyApp
пространстве может просто ссылатьсяUser
(например,new User();
), и поэтому может кодироваться вCoolPlugin
пространстве; каждый получит ожидаемый результат. Когда вам нужно использовать код из другого пространства имен, вы просто префикс его. Например, код вCoolPlugin
пространстве может получить доступ кUser
классуMyApp
черезnew \MyApp\User();
Альтернатива состоит в том, что каждому классу везде нужно сложное имя , такое как
class MyApp_User
иclass CoolPlugin_User
. Пространства имен позволяют вам упростить вещи большую часть времени и всегда избегать конфликтов имен.Изменить: Чтобы ответить на вопрос "Есть ли разница в производительности между двумя?"
Не значащий, нет. Я не тестировал его, но, вероятно, есть разница на уровне наносекунд. Тем не менее, жертвовать качеством кода ради сверхмалых настроек производительности не очень хорошая стратегия, поэтому вы должны использовать пространства имен независимо от того. Для тестов подобных проблем см. PHPbench.com и этот ответ StackOverflow .
Ваш код должен быть невероятно трудным и невероятно чувствительным ко времени (например, высокочастотная торговля или управление ядерными реакциями), прежде чем вам придется беспокоиться о его микрооптимизации в такого рода контексте. Если это действительно так чувствительно ко времени, вы, вероятно, должны писать код на c или даже на ассемблере , а не на интерпретируемых языках, таких как PHP.
источник