Часті питання (FAQ): що потрібно знати про простори імен
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Цей перелік питань поділено на дві частини: загальні питання та деякі особливості реалізації, які корисні для повного розуміння.
Спершу, спільні питання.
- Якщо в коді не вказано простору імен, чи потрібно вважати щось із цього важливим?
- Як звертатися до внутрішніх чи глобальних класів у просторі імен?
- Як звертатися до функцій класів у просторах імен, чи константам у їхньому просторі імен?
- Як дозволяються імена
\my\name
или\name
? - Як дозволяється ім'я
my\name
? - Як дозволяється неповне ім'я класу
name
? - Як дозволяється неповне ім'я функції або неповне ім'я константи на кшталт
name
?
Деякі деталі реалізації просторів імен, які корисно розуміти.
- Імпортовані імена не повинні конфліктувати з класами, визначеними в файлі.
- Вкладені простори імен неприпустимі.
- Динамічні імена просторів імен (ідентифікатори, взяті в лапки) повинні екранувати символ зворотного слішу.
- Посилатися на невизначені константи, використовуючи зворотний сліш, не можна. Виводиться фатальна помилка
- Неможливо перевизначити спеціальні константи
null
true
абоfalse
Якщо в коді не вказано простору імен, чи потрібно вважати щось із цього важливим?
Ні, простори імен ніяк не впливають ні на існуючий код, ні ще не написаний код без просторів імен. Можна написати такий код, якщо потрібно:
Приклад #1 Доступ до глобальних класів поза межами імен
Loading...
Це функціонально еквівалентно наступному:
Приклад #2 Доступ до глобальних класів поза простором імен
Loading...
Як звертатися до внутрішніх чи глобальних класів у просторі імен?
Приклад #3 Доступ до внутрішніх класів у просторах імен
Loading...
Як використовувати функції класів у просторах імен чи константи у власному просторі імен?
Приклад #4 Доступ до внутрішніх класів, функцій або константів у просторах імен
Loading...
Как имена вроде\my\name
или\name
перетворюються?
Імена, які починаються з \
, Перетворюються до того, як вони виглядають, тобто . \my\name
- це насправді my\name
, а\Exception
- це Exception
Приклад #5 Абсолютні імена
Loading...
Як ім'я my\name
преобразуется?
Імена, які містять зворотний сліш, але не починаються з нього, такі як my\name
можуть бути перетворені двома способами.
Якщо є імпортуючий вираз, який створює синонім my
іншого імені, то цей синонім застосовується до my
вmy\name
В іншому випадку, поточне ім'я простору імен стає префіксом до my\name
Приклад #6 Повні імена
Loading...
Как неполное имя класса вродеname
перетворюється?
Імена класів, які не містять зворотного слішу, наприклад, name
можуть бути перетворені двома способами.
Якщо є імпортуючий вираз, який створює синонім name
іншого імені, то застосовується цей синонім.
В іншому випадку, поточне ім'я простору імен стає префіксом до name
Приклад #7 Неповні імена класів
Loading...
Як неповне ім'я функції або неповне ім'я константи, наприклад, name
перетворюється?
Імена функцій або констант, які не містять зворотного слішу, наприклад, name
можуть бути перетворені двома способами.
Спочатку поточне ім'я простору імен стає префіксом до name
Потім, якщо константа чи функція name
не існує в поточному просторі імен, буде використано глобальну константу або функцію name
якщо вона існує.
Приклад #8 Неповні імена функцій або констант
Loading...
Імпортовані імена не повинні конфліктувати з класами, визначеними в файлі.
Наступні комбінації скриптів допустимі:
file1.php
Loading...
another.php
Loading...
file2.php
Loading...
Конфлікт імен відсутній навіть незважаючи на те, що клас MyClass
існує всередині простору імен my\stuff
, тому що визначення MyClass знаходиться в окремому файлі. Однак наступний приклад призводить до фатальної помилки з конфліктом імен, тому що клас MyClass визначений у тому файлі, де знаходиться оператор use.
Loading...
Вкладені простори імен неприпустимі.
PHP не дозволяє вкладення просторів імен одне в інше
Loading...
Однак, можна зімітувати вкладені простори імен так:
Loading...
Динамічні імена просторів імен (ідентифікатори, взяті в лапки) повинні екранувати символ зворотного слішу.
Важливо розуміти це, тому що зворотний сліш усередині рядків працює як символ, що екранує. Він має бути продубльований, коли вказано всередині рядка, інакше з'являється ризик ненавмисних наслідків:
Приклад #9 Підводне каміння при вказівці імені простору імен усередині рядка з подвійними лапками
Loading...
Усередині рядків, укладених в одинарні лапки, зворотний слєш як роздільник більш безпечний, але, як і раніше, рекомендована практика екранування зворотного слєша в усіх рядках є найкращим варіантом.
Посилатися на невизначені константи, використовуючи зворотний сліш, не можна. Виводиться фатальна помилка
Будь-яка невизначена константа — неповне ім'я на зразок FOO
- буде приводити до висновку повідомлення про те, що PHP припустив, що FOO
було значення константи. Будь-яка константа, з повним або абсолютним ім'ям, яка містить символ зворотного сліша, буде призводити до фатальної помилки, якщо не буде знайдена.
Приклад #10 Невизначені константи
Loading...
Неможливо перевизначити спеціальні константи null
true
або false
Будь-яка спроба визначити константу простору імен, яка збігається з назвами спеціальних вбудованих констант, призведе до фатальної помилки.
Приклад #11 Невизначені константи
Loading...