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

На этом все!

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

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

  1. Напишите первый комментарий
*Комментарий будет опубликован после проверки модератором

[MODx] Генератор настроек MIGX

Документация на русском по MODX MIGX

[JS] Маска для ввода телефона +7(___)___-__-__

[MODX] Импорт и экспорт в MiniShop2. Реализация 1

[MODx] minishop2 tips

Как включить HTTPS (SSL) в MODX - Подробная инструкция

[MODx, miniShop2] Генерация YML для выгрузки в маркет

jQuery.Maskedinput js - документация на русском с примерами

[MODx] Подсказки по API

[OpenCart] Вывести на главную все категории с картинками

[MODx] Сайт на обслуживании (выключить сайт)

[MODx, MIGX] Примеры использования

[PHP, JSON] Пример перевода с помощью Yandex Translate API

Расширение свойств товаров minishop2

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

[MODx, Gallery] Галерея. Вывести обложки альбомов и фотографии

[Opencart] Вернуть английский язык, если вы его удалили

[OpenCart] Вывести модуль напрямую через контроллер

[MODX, MiniShop2] Примеры выборки where, optionFilters, innerJoin

[MODX, MIGX] Вывести getImageList только если он не пустой

[MODX] pThumb - ресайз изображений. Примеры использования.

[MODX, MIGX] Тип поля "Список ресурсов" (resourcelist) с ограничением по родителю (parents)

[MODx, Quip] Более рабочий вариант.

Отключить автозаполнение input

Красивое адаптивное меню под pdoMenu

Все записи

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