Using namespaces: Basics
Оновлено: 09.05.2023
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
Перш ніж обговорювати використання просторів імен, важливо зрозуміти, як PHP дізнається, який елемент простору імен запитує ваш код. Можна провести просту аналогію між просторами імен PHP і файловою системою. Існує три способи доступу до файлу у файловій системі:
Відносне ім'я файлу, наприклад foo.txt. Воно перетворюється на currentdirectory/foo.txt, де currentdirectory - це поточний каталог, у якому ви перебуваєте. Отже, якщо поточним каталогом є /home/foo, ім'я розпізнається як /home/foo/foo.txt. Відносне ім'я шляху, наприклад, subdirectory/foo.txt. Розв'язується у поточний каталог/підкаталог/foo.txt. Абсолютний шлях, наприклад /main/foo.txt. Розв'язується до /main/foo.txt.
Некваліфіковане ім'я або ім'я класу без префікса, наприклад $a = new foo(); або foo::staticmethod();. Якщо поточним простором імен є поточний простір імен, це розпізнається як currentnamespace\foo. Якщо код є глобальним кодом без простору імен, він перетворюється на foo. Одне застереження: некваліфіковані імена функцій і констант буде перетворено на глобальні функції і константи, якщо функцію або константу не визначено у просторі назв. Докладні відомості наведено у розділі Використання просторів назв: перехід до глобальної функції/константи. Кваліфіковане ім'я або префіксоване ім'я класу на зразок $a = new subnamespace\foo(); або subnamespace\foo::staticmethod();. Якщо поточним простором імен є currentnamespace, то це розпізнається як currentnamespace\subnamespace\foo. Якщо код є глобальним кодом без простору імен, він розпізнається як subnamespace\foo. Повне ім'я або префіксоване ім'я з глобальним префіксним оператором, наприклад $a = new \currentnamespace\foo(); або \currentnamespace\foo::staticmethod();. Це завжди призводить до буквального імені, вказаного у коді, currentnamespace\foo.
Ось приклад трьох типів синтаксису в реальному коді:
file1.php
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
file2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* Unqualified name */
foo(); // resolves to function Foo\Bar\foo
foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO
/* Qualified name */
subnamespace\foo(); // resolves to function Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // resolves to class Foo\Bar\subnamespace\foo,
// method staticmethod
echo subnamespace\FOO; // resolves to constant Foo\Bar\subnamespace\FOO
/* Fully qualified name */
\Foo\Bar\foo(); // resolves to function Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo \Foo\Bar\FOO; // resolves to constant Foo\Bar\FOO
?>
Зауважте, що для доступу до будь-якого глобального класу, функції або константи можна використовувати повне ім'я, наприклад, \strlen(), \Exception або \INI_ALL.
Приклад #1 Доступ до глобальних класів, функцій та констант з простору імен
<?php
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = \strlen('hi'); // calls global function strlen
$b = \INI_ALL; // accesses global constant INI_ALL
$c = new \Exception('error'); // instantiates global class Exception
?>