#9.1 php Пространства имен (namespace). Объявление нового пространства имен. Что это такое?

Объявление нового пространства имен

Для объявления нового пространства имен (доступно, начиная с PHP 5.3) используется ключевое слово namespace, после которого следует имя пространства

<?php
namespace example;
/*дальше идет какой-то код, для которого пространство имен
 example является текущим*/

Замечания:

  • Зарезервированные имена php и PHP не могут использоваться в качестве названий пользовательских пространств имен:
    <?php
    namespace php; //ошибка — имя php зарезервировано
    
  • Объявление пространства имен должно предшествовать любому другому коду (кроме ключевого слова declare). В частности, например, такой код будет ошибочным:
    <html>
    <?php
    namespace example; //ошибка — namespace должно идти первым в скрипте
    

Что такое пространство имен?

Пространство имен — это фрагмент программы, имеющий имя. Пространство имен можно описать как виртуальный каталог (подобно каталогам файловой системы), в котором группируется логически связанный между собой код. Имея доступ к пространству имен, можно получить доступ к объявленным внутри него:

При этом, например, две функции с одинаковыми именами не могут использоваться в одном пространстве имен, но могут быть разнесены по двум разным пространствам. Как правило (хотя это не обязательно так), для каждого пространства создается свой физический файл.

Пример 1. Разнесение двух фунцкий с одинаковыми именами по разным пространствам имен

файл "cat.php":

<?php 
namespace cat;

function speak()
{
    echo "meow";
}

файл "dog.php":

<?php 
namespace dog;

function speak()
{
    echo "woof";
}

Несколько namespace в одноим файле

Не рекомендуется описывать два и более пространства имен в одном файле. Однако в случае такой необходимости желательно применять синтаксис, при котором содержимое каждого пространства имен заключается в фигурные скобки. При объединении кода глобального пространства с кодом в каком-то другом пространстве такой синтаксис обязателен.

Пример 2. Два пространства имен в одном файле

<?php 
namespace cat {

    function speak()
    {
        echo "meow";
    }
}

namespace dog {
    
    function speak()
    {
         echo "woof";
    }
}

namespace { //глобальное пространство имен
    echo dog\speak();
}

Глобальное пространство имен. Переопределение стандартных констант, классов и функций

Одним из важных преимуществ использования пространств имен является предотвращение конфликтов имён пользовательских и встроенных PHP-функций.

Стандартные константы, классы и функции находятся в глобальном пространстве имен и могут быть перегружены в пользовательских пространствах. Например, стандартную функцию min() можем переопределить так, чтобы она сравнивала на минимум абсолютные значения переданных аргументов:

<?php
namespace my;

function min()
{
    $arg_list = func_get_args();
    $result = abs($arg_list[0]);

    for ($loop_index = 1; $loop_index < func_num_args(); 
    $loop_index++) {
        $result = $result > abs($arg_list[$loop_index]) ? abs($arg_list[$loop_index]) : $result;
    }
    
    return $result;
}
echo min(-5, 3);  //результат: 3

При этом обращение к стандартной функции глобального пространства тоже возможно через слеш :

echo \min(-5,3) //результат -5

Итак, находясь внутри пространства имен, мы можем обращаться к объявленным внутри него функциям, константам, классам и т.д., как обычно, просто по имени. В следующем разделе описывается, как использовать элементы некоторого пространства имен в другом (пользовательском или глобальном) пространстве.

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

по поводу:

namespace example

обычно после объявления пространства имен ставят точку с запятой, не уверен что без этого вообще запустится:

<?php

namespace App\Command;

_____________
матфак вгу и остальная классика =)

mariyas's picture

пока что черновик) потом весь код буду проверять