Namespace на примерах - Как понять пространства имен в PHP

Чтобы понять как работают пространства имен мы начнем с того, что создаем и вызываем классы в глобальном пространстве имен:

  // file_1.php
  class UserClass{
    public function __construct(){
      echo "Это UserClass";
    }
  }
  // file_2.php
  require_once("file_1.php");
  $uc = new UserClass();

Все работает, при выполнении кода выводится сообщение "Это UserClass".

Теперь добавим лишь одну строчку с указанием некоего пространства имен:

  // file_1.php
  namespace MyClassNamespace;
  class UserClass{
    public function __construct(){
      echo "Это UserClass";
    }
  }

Теперь при вызове file_2.php получаем ошибку:

  Fatal error: Uncaught Error: Class 'UserClass' not found in ...file_2.php

Причина, по которой мы получаем ошибку заключается в том, что в глобальнм пространстве имен уже нет класса UserClass.

Стоит отметить! Объявляя пространство имен в файле file_1.php мы обозначаем, что указанные ниже по коду классы, константы (указанные через ключевое слово const) и функции будут доступны только в этом пространстве имен. Обычные переменные типа $var и константы, определенные через define() будут доступны глобально.

Чтобы обратиться к классу (или константе) нужно указать пространство имен, в котором он находится. Мы разберем несколько вариантов того, как это можно сделать.

Вариант 1: Указать пространсво имен непосредственно при вызове класса

  // file_2.php
  require_once("file_1.php");
  $uc = new MyClassNamespace\UserClass();

Вариант 2: использовать оператор use для определения пространства имен для используемого класса

  // file_2.php
  require_once("file_1.php");
  use MyClassNamespace\UserClass;
  $uc = new UserClass();

Вариант 2.1: Добавить псевданим с возможностью указать произвольное имя

  // file_2.php
  require_once("file_1.php");
  use MyClassNamespace\UserClass as CurrentUser;
  $uc = new CurrentUser();

Как обратиться к глобальному классу изнутри некоего пространства имен

Причина такого вопроса в том, что обозначая свое пространство имен мы перестаем иметь непосредственный контакт с глобальным пространством имен.

Для обращения к классу, функции или константе нам нужно указать обратный слэш перед их именем: \GlobalUserClass()

  // file_3.php
  class GlobalUserClass{
    public function __construct(){
      echo "Это GlobalUserClass\r\n";
    }
  }
  // file_4.php
  namespace MyNamespace; // Обозначаем пространство имен

  // Подключаем класс с глобальным пространство имен
  require_once("file_3.php");
  
  $guc1 = new \GlobalUserClass();

Благодаря вызову с обратным слэшом мы получили доступ к классы, находящемуся в глобальном пространстве имен

Вложенные зоны видимостимости. Есть ли такое?

Часто можно увидеть запись на подобии App\Category\Utilits\Awesome. Как стоит интерпретировать такую последовательность?

В PHP, в отличии от Python или Java, по историческим причинам нет строгой зависимости между пространствами имен и файловой структурой. Однако, следуя стандартам качества кода, разработчики следят за тем, чтобы пространства имен точно соответствовали названиям папок в файловой системе. Поэтому, такая вложенность означает, что исполняемый класс Awesome наверняка будет находиться в файле Awesome.php, который находится в папке App\Category\Utilits. Или (реже) — в папке App\Category будет найден файл Utilits.php, в котором расположен класс Awesome(). Но где находится папка App и называется ли она именно так — на этот вопрос сложнее ответить. Но чаще всего это какой-то интуитивно понятный корневой раздел проекта. Также подсказку можно найти в файле composer.json — там может быть указан алиас для корневого каталога.

Например в Laravel 6 (в тестовом проекте blog) мы можем увидеть строчку:

  use Illuminate\Foundation\Auth\User as Authenticatable;

Это будет означать, что нужно заглануть в файл vendor\laravel\framework\src\Illuminate\Foundation\Auth\User.php

На этом все!

Пишите в комментариях нашли ли вы в этой заметки все ответы на свои вопросы по данной теме.

Комментарии (3)

  1. Георгий 21 мая 2022, 12:30 # 0
    ты не русский, ты пиздюк
    1. Ваня 02 мая 2023, 22:40 # 0
      Да русское хавно
      1. Oleg S./Zhiva 01 декабря 2023, 12:46 # 0
        благодарю! полезная информация
        *Комментарий будет опубликован после проверки модератором

        Похожие статьи

        Пример перевода с помощью Yandex Translate API

        Универсальная форма обратной связи — feedBackForm

        Как контролировать кэш CSS и скриптов

        Как поменять версию PHP, используемую в командной строке на Windows

        Как поменять язык в Faker

        Транслитерация URL в Laravel. Примеры str_slug()

        Простое логирование

        Курсы валют с cbr.ru на PHP

        Разные фишки, заготовки

        Получить вложенный массив из плоского

        Laravel Excel - Базовый экспорт

        Namespace на примерах - Как понять пространства имен в PHP

        Заготовки для автоматического заполнения товарами магазина 1.5.5.1.2

        Как сделать middleware в Laravel 6 - простой пример

        Примеры работы с API

        Как обработать POST данные в PHP

        Загрузить файл для постобработки

        Получить время выполнения PHP скрипта. Решение в 3 строки кода

        Получить курсы валют с cbr.ru на PHP с кэшированием результатов

        Экспорт маршрутов из Laravel в JSON файл

        Фиксированная сортировка массива на основе хэша

        Вывести список всех файлов на сервере (и размер файла)

        Наш сайт использует куки, нажмите «ОК» если вы не против
        OK