HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В этом уроке вы узнаете, что делать при совпадении имен в проекте и как работают пространства имен.</p>
1 <p>В этом уроке вы узнаете, что делать при совпадении имен в проекте и как работают пространства имен.</p>
2 <p>Если мы попытаемся определить две разные функции с одинаковыми именами, то PHP выдаст ошибку во время запуска кода:</p>
2 <p>Если мы попытаемся определить две разные функции с одинаковыми именами, то PHP выдаст ошибку во время запуска кода:</p>
3 <p>А если разнести определения этих функций по разным файлам и включить один в другой? Чуда не произойдет - как только интерпретатор встретит новое определение с уже известным именем, он завершит работу с ошибкой<strong>Cannot redeclare</strong>- "невозможно переопределить существующую функцию".</p>
3 <p>А если разнести определения этих функций по разным файлам и включить один в другой? Чуда не произойдет - как только интерпретатор встретит новое определение с уже известным именем, он завершит работу с ошибкой<strong>Cannot redeclare</strong>- "невозможно переопределить существующую функцию".</p>
4 <p>Давайте порассуждаем над тем, в чем здесь проблема.</p>
4 <p>Давайте порассуждаем над тем, в чем здесь проблема.</p>
5 <p>Реальные приложения на PHP состоят из многих тысяч строк кода. Значительная часть этого кода приходит из библиотек, написанных другими людьми. Почти наверняка, мы не знаем, как они там внутри устроены.</p>
5 <p>Реальные приложения на PHP состоят из многих тысяч строк кода. Значительная часть этого кода приходит из библиотек, написанных другими людьми. Почти наверняка, мы не знаем, как они там внутри устроены.</p>
6 <p>Представьте ситуацию: вы используете много библиотек, над проектом работает множество разработчиков, растет объем кода в проекте. Чем больше становится проект, тем выше вероятность столкнуться с повторяющимися названиями.</p>
6 <p>Представьте ситуацию: вы используете много библиотек, над проектом работает множество разработчиков, растет объем кода в проекте. Чем больше становится проект, тем выше вероятность столкнуться с повторяющимися названиями.</p>
7 <p>Усложним ситуацию. Представьте, что вы используете две разные библиотеки с одинаковыми именами функций. Таким образом, вы физически не сможете использовать вместе эти две библиотеки.</p>
7 <p>Усложним ситуацию. Представьте, что вы используете две разные библиотеки с одинаковыми именами функций. Таким образом, вы физически не сможете использовать вместе эти две библиотеки.</p>
8 <p>Еще включение каждой новой библиотеки в код проекта почти наверняка заставит переименовывать функции самого проекта из-за конфликта имен. Когда-то эта проблема была настолько серьезной, что функции в PHP именовались с префиксами, например:</p>
8 <p>Еще включение каждой новой библиотеки в код проекта почти наверняка заставит переименовывать функции самого проекта из-за конфликта имен. Когда-то эта проблема была настолько серьезной, что функции в PHP именовались с префиксами, например:</p>
9 <ul><li>mylibnameSendEmail()</li>
9 <ul><li>mylibnameSendEmail()</li>
10 <li>mylibnameAddNewUser()</li>
10 <li>mylibnameAddNewUser()</li>
11 </ul><p>Таким образом разработчики пытались избежать<strong>коллизий</strong>- пересечений по именам.</p>
11 </ul><p>Таким образом разработчики пытались избежать<strong>коллизий</strong>- пересечений по именам.</p>
12 <p>Начиная с версии 5.3, в PHP появился механизм<strong>пространств имен</strong>. Их задача - изоляция кода разных файлов друг от друга.</p>
12 <p>Начиная с версии 5.3, в PHP появился механизм<strong>пространств имен</strong>. Их задача - изоляция кода разных файлов друг от друга.</p>
13 <p>Это новый для нас механизм, но сама концепция встречается в нашей жизни повсеместно, например:</p>
13 <p>Это новый для нас механизм, но сама концепция встречается в нашей жизни повсеместно, например:</p>
14 <ul><li>В файловой системе роль пространств имен выполняют директории</li>
14 <ul><li>В файловой системе роль пространств имен выполняют директории</li>
15 <li>В телефонах - код страны</li>
15 <li>В телефонах - код страны</li>
16 <li>В адресах - страны, города и улицы</li>
16 <li>В адресах - страны, города и улицы</li>
17 </ul><p>Последний пример демонстрирует<strong>вложенные пространства имен</strong>. Недостаточно знать только номер дома, чтобы понять, в какой квартире живет человек. Кроме этого, надо знать улицу, город и страну.</p>
17 </ul><p>Последний пример демонстрирует<strong>вложенные пространства имен</strong>. Недостаточно знать только номер дома, чтобы понять, в какой квартире живет человек. Кроме этого, надо знать улицу, город и страну.</p>
18 <p>Вложенные пространства имен создают подобную вложенную структуру:</p>
18 <p>Вложенные пространства имен создают подобную вложенную структуру:</p>
19 <p>В подавляющем большинстве языков есть встроенные механизмы, аналогичные пространствам имен. Причем в этих языках они существовали с самого начала, а не были добавлены потом. Часто они имеют другие имена - например, модули или пакеты. В каждом языке подобный механизм работает чуть-чуть по-своему, но все они предназначены для разрешения коллизий при именовании.</p>
19 <p>В подавляющем большинстве языков есть встроенные механизмы, аналогичные пространствам имен. Причем в этих языках они существовали с самого начала, а не были добавлены потом. Часто они имеют другие имена - например, модули или пакеты. В каждом языке подобный механизм работает чуть-чуть по-своему, но все они предназначены для разрешения коллизий при именовании.</p>
20 <p>К сожалению, в силу исторических причин, пространства имен в PHP появились не с самого начала существования языка, как это принято при разработке языков. Из-за этого получилось, два независимых механизма борьбы с коллизиями:</p>
20 <p>К сожалению, в силу исторических причин, пространства имен в PHP появились не с самого начала существования языка, как это принято при разработке языков. Из-за этого получилось, два независимых механизма борьбы с коллизиями:</p>
21 <ul><li>Включение файлов как таковых</li>
21 <ul><li>Включение файлов как таковых</li>
22 <li>Пространства имен</li>
22 <li>Пространства имен</li>
23 </ul><p>Пора переходить к примерам:</p>
23 </ul><p>Пора переходить к примерам:</p>
24 <p>Пространство имен задается с помощью ключевого слова namespace, за которым следует имя пространства имен. Теперь посмотрим, как использовать функции, определенные в пространстве имен:</p>
24 <p>Пространство имен задается с помощью ключевого слова namespace, за которым следует имя пространства имен. Теперь посмотрим, как использовать функции, определенные в пространстве имен:</p>
25 <p>Попытка обратиться к функции по имени приведет к ошибке, так как функция скрыта за пространством имен. Правильный вызов выглядит так:</p>
25 <p>Попытка обратиться к функции по имени приведет к ошибке, так как функция скрыта за пространством имен. Правильный вызов выглядит так:</p>
26 <p>Рассмотрим еще один пример, когда функция с одним и тем же именем определена в разных пространствах имен:</p>
26 <p>Рассмотрим еще один пример, когда функция с одним и тем же именем определена в разных пространствах имен:</p>
27 <p>Два пространства имен имеют одинаковые функции, но это не создает неудобств. Каждая функция вызывается с указанием собственного пространства имен.</p>
27 <p>Два пространства имен имеют одинаковые функции, но это не создает неудобств. Каждая функция вызывается с указанием собственного пространства имен.</p>
28 <p>Более того, мы можем определить функцию multiply() прямо в том месте, куда производится включение других пространств имен:</p>
28 <p>Более того, мы можем определить функцию multiply() прямо в том месте, куда производится включение других пространств имен:</p>
29 <p>Обратите внимание на последний вызов - функции внутри одного пространства имен могут вызывать друг друга напрямую.</p>
29 <p>Обратите внимание на последний вызов - функции внутри одного пространства имен могут вызывать друг друга напрямую.</p>