Плюсы и минусы пространств имен против включения / требуют в PHP?

20

Я недавно начал использовать пространства имен в PHP. Когда я впервые увидел их, я подумал, что их синтаксис уродлив, и я никогда не буду их использовать. Тем не менее, я создал автозагрузчик (spl_autoload_register), который делает его таким, чтобы мне больше никогда не приходилось писать оператор include / require.

Мне нравятся пространства имен, но есть ли какая-то объективная выгода по сравнению с операторами include / require, или это один и тот же метод для достижения той же цели?

NobleUplift
источник
1
Пространства имен предотвращают конфликты со сторонними библиотеками.
Reactgular
1
Сейчас для меня главное преимущество в отношении пространств имен - автозагрузка. Например, я использую in-line new \Vendor\Namespace\Class()без оператора require ранее в методе или классе.
NobleUplift
3
Многие библиотеки PHP используют автозагрузку без пространств имен. PHP должен сделать пространства имен обязательными.
Reactgular
Никаких аргументов от меня. Я хотел бы видеть все эти изменения, перечисленные здесь .
NobleUplift

Ответы:

21

Пространства имен предназначены не только для автозагрузки классов. Они также предотвращают конфликты имен. На самом деле, это их основная цель.

Скажем, у вас есть проект, которому нужен класс с именем Userдля хранения информации о пользователях вашего приложения, но плагин также использует (другой) класс с именами Userдля хранения информации. Пространства имен позволяют вам создать свой класс в одном пространстве имен (скажем, MyApp) и позволить плагину использовать другое пространство имен (скажем, CoolPlugin). Код в MyAppпространстве может просто ссылаться User(например, new User();), и поэтому может кодироваться в CoolPluginпространстве; каждый получит ожидаемый результат. Когда вам нужно использовать код из другого пространства имен, вы просто префикс его. Например, код в CoolPluginпространстве может получить доступ к Userклассу MyAppчерезnew \MyApp\User();

Альтернатива состоит в том, что каждому классу везде нужно сложное имя , такое как class MyApp_Userи class CoolPlugin_User. Пространства имен позволяют вам упростить вещи большую часть времени и всегда избегать конфликтов имен.

Изменить: Чтобы ответить на вопрос "Есть ли разница в производительности между двумя?"

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

Ваш код должен быть невероятно трудным и невероятно чувствительным ко времени (например, высокочастотная торговля или управление ядерными реакциями), прежде чем вам придется беспокоиться о его микрооптимизации в такого рода контексте. Если это действительно так чувствительно ко времени, вы, вероятно, должны писать код на или даже на , а не на интерпретируемых языках, таких как PHP.

elixenide
источник
1
+1 Я просто отмечаю, что каждый проект начинает выглядеть так, как будто ему не нужны пространства имен, а затем легко вырастает до такой степени, что становится нелепо взламывать вещи, работая без них. Отсутствие пространств имен - это то же самое, что объявлять все переменные глобальными применительно к классам. На больших кодовых базах или тех, которые свободно используют библиотеки, это становится полным беспорядком.
BrianH
1
Пожалуйста, смотрите мое редактирование выше.
эликсид
2
Я упоминал, что я делаю интерфейс PHP для Большого адронного коллайдера? В противном случае, я считаю, что этого ответа достаточно, спасибо.
NobleUplift
1
Пожалуйста, не создавайте кварковые звезды или черные дыры! Рад помочь.
эликсид
1
Не волнуйся, только странники. Мы создаем адронные пушки - я имею в виду что-то научное, а не оружие.
NobleUplift