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
?>