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>