PHP Учебник

PHP Старт Введение в PHP Установка PHP Синтаксис PHP Комментарии в PHP Переменные PHP PHP Echo / Print Типы данных PHP Строки PHP Числа PHP Математика в PHP Константы PHP Операторы PHP PHP If...Else...Elseif PHP Switch Циклы в PHP Функции PHP Массивы PHP PHP Суперглобальные PHP RegEx

PHP Формы

Обработка форм PHP Валидация форм PHP Обязательные поля Валидация URL/E-mail Полная форма PHP

PHP Продвинутый

PHP Дата и время PHP Include/Require PHP Работа с файлами Открытие/Чтение файлов Создание/Запись файлов PHP Загрузка файлов Файлы cookie PHP Сессии PHP Фильтры PHP Расширенные фильтры PHP Функция Callback PHP JSON PHP Исключения

PHP OOP

Что такое ООП в PHP Классы/Объекты PHP Цепочки методов PHP Конструктор PHP Деструктор PHP Модификаторы доступа Наследование в PHP Константы класса PHP Подсказка типов PHP Подсказка интерфейсов Абстрактные классы PHP PHP Интерфейсы PHP Полиформизм PHP Трейты Статические методы PHP Статические свойства PHP Пространства имен PHP Итерируемые объекты

База данных MySQL

База данных MySQL Подключение к MySQL Создание БД MySQL Создание таблицы MySQL Вставка данных MySQL Получить ID MySQL Подготовленные операторы PHP MySQL Получение данных MySQL Предложение WHERE Предложение ORDER BY Обновление данных MySQL Удаление данных БД MySQL Limit Data

PHP XML

Парсеры PHP XML Парсер PHP SimpleXML Получить PHP SimpleXML PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Введение AJAX PHP AJAX База Данных AJAX XML AJAX Живой поиск AJAX Опрос

PHP Примеры

PHP Примеры Практика ООП PHP PHP квиз-тест Упражнения Базовый PHP Упражнения Алгоритмы Упражнения Массивы Упражнения Цикл for Упражнения Функции Регулярные выражения Упражнения Дата PHP Упражнения Строки PHP Математика PHP Упражнения Формы PHP Упражнения Классы PHP Упражнения JSON PHP PHP Задачник


Пространства имен в PHP




Работая со сложными сценариями, может возникнуть ситуация, когда при инициализации переменной или функции возникает непреднамеренное дублирование имен, что нарушит ход компиляции скрипта и выдаст ошибку. В этом уроке мы рассмотрим выжное понятие в PHP – пространства имен, применяя которое мы избавимся о ошибкок, связанных с дублированием имен в вашем сценарии.


Пространства имен — это квалификаторы, которые решают две разные проблемы:

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

Если мы попытаемся определить две разные функции, но с одинаковыми именами, то PHP выдаст ошибку во время запуска кода. Проблема этого ограничения в том, что если вы используете чью-либо стороннюю библиотеку, предоставляющую класс например, с именем User, то вы не можете создать свой собственный класс с таким же именем.

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

Концепция определения и вызова пространств имен аналогична обычной файловой структуре в наших операционных системах.

Представьте, что пространства имен — это папки, а файлы — классы:

  • В папке /base/math может быть несколько файлов: numbers.php, calcul.php и так далее. Но не может быть двух файлов с одинаковым именем.
  • Для доступа к numbers.php из файла calcul.php, вы можете напрямую обратиться к numbers.php
  • В папке /base/mechanic также может быть несколько файлов: physics.php, electro.php и т.д. И здесь же у вас может быть файл numbers.php, даже если файл с этим именем существует в папке /base/math.
  • Внутри папки /mechanic для доступа к numbers.php вы будете ссылаться /base/mechanic/numbers.php
  • Внутри папки /mechanic, если вам нужно было сослаться на файл numbers.php, который находится в папке /base/ math, вам нужно будет использовать /base/math/numbers.php

Точно так же работает пространства имен.

Пространство имён задается с помощью ключевого слова namespace, за которым следует имя пространства имён:

Синтаксис

<?php
namespace MyApp;
?>

Примечание: Декларация namespace должна прописываться в первой строке сценария сразу после <?php (за исключением ключевого слова declare). В противном случае ваш код будет недействительным.

Если мы добавим объявление пространства имен в начало файла PHP, все классы, функции и константы будут элементами этого пространства имен.

Создадим файл с именем Math.php и добавим следующий код:

Math.php

Пример

<?php
namespace Math;

function add($a, $b) {
  return $a + $b;
}
const PI = 3.14;

class Geometry {
  static function getCircleArea($radius) {
    return PI * $radius ** 2;
  }
}
?>
  • Сначала мы объявляем пространство имен — namespace Math;. (Теперь, все классы, интерфейсы, константы и функции будут элементами этого пространства имен)
  • Затем мы объявили функцию add().
  • Затем константа класса PI.
  • Затем класс Geometry.

Следующим шагом создадим еще один файл с именем usage.php и получим доступ к элементам указанного выше пространства имен Math (функциям, константам и классам).

usage.php
<?php
// включает файл Math.php
// Как будто у вас здесь был написан весь код Math.php
include_once 'Math.php';

echo Math\add(4,7); // 11
echo "<br>";
echo Math\PI; // 3.14
echo "<br>";
echo Math\Geometry::getCircleArea(5); // 78.5
?>

Примечание: Символ \ используется для перехода на уровень ниже в пространствах имен.

Когда одновременно используются несколько классов из одного и того же пространства имен, проще использовать ключевое слово namespace, чтобы не прописывать каждый раз квалификатор Math\.

В следующем примере мы получим доступ к элементам указанного выше пространства имен Math без квалификатора Math\:

<?php
namespace Math;
include_once 'Math.php';

echo add(3,9); // 12
echo "<br>";
echo PI; // 3.14
echo "<br>";
echo Geometry::getCircleArea(10); // 314.15
?>
В операционной системе папки внутри могут содержать другие папки. Таким же образом пространства имен могут содержать пространства имен. Они называются подпространствами имен.

Пример

<?php
namespace Math\Geometry;

// ... ваши классы Geometry
?>

В следующем примере мы создадим пространство имен с именем Math, а также добавим в него подпространства имен и классы:

  • Создадим основное пространство имен: Math
  • Добавим одно подпространство имен: Math\Geometry (для обработки геометрии)
  • Создадим два класса: Math\Constants (для сохранения часто используемых констант) и Math\Geometry\Circle (для вычисления диаметра, площади, длины окружности)

Вот окончательная структура нашего проекта:

/src
  /Math
    /Geometry
      Circle.php
    Constants.php

Math/Constants.php

Пример

<?php
namespace Math;

class Constants {
  const PI = 3.14159;
}
?>

Math/Geometry/Circle.php

Пример

<?php
namespace Math\Geometry;

class Circle {  
  public $radius;
  public function __construct($radius) {
    $this -> radius = $radius;
  }
  public function getDiameter() {
    return $this -> radius * 2;
  }
  public function getArea() {
    // (pi)(r^2)
    return \Math\Constants::PI * $this -> radius ** 2; 
  }
  public function getCircumference() {
    // 2(pi)(r)
    return 2 * \Math\Constants::PI * $this -> radius;
  }
}
?>

Примечание:

В файле Circle.php мы прописали \Math\Constants::PI ссылаясь на константу в файле Constants.php. Это потому, что сценарий PHP выполняется всегда относительно текущего пространства имен. Когда пространство имен начинается с обратной косой черты ( \ ), то путь к имени элемента будет исчисляться относительно глобального пространства имен.

  • Если бы мы просто прописали Constants::PI в файле Circle.php, то ссылка была бы ткой \Math\Geometry\ Constants::PI.
  • Если бы мы использовали Math\Constants::PI (без обратной косой черты \) в файле Circle.php, то получили бы ссылку \Math\Geometry\ Math\Constants::PI

Наконец, давайте используем наши классы в файле index.php, который должен находиться в корневой папке вашего проекта:

<?php
include_once 'src/Math/Constants.php';
include_once 'src/Math/Geometry/Circle.php';

$circle = new  Math\Geometry\Circle(5);

echo $circle -> getDiameter();    // 10
echo "<br>";
echo $circle -> getArea();      // 78.5
echo "<br>";
echo $circle -> getCircumference(); // 31.4
?>

В примере выше мы первым делом включили файлы классов Constants.php и Circle.php. Затем использовал класс Math\Geometry\Circle и его методы.

Важно отметить, что index.php автоматически будет находиться в глобальном пространстве имен, так как мы не указали для него не одного из пространств имен.

Если в нашем проекте предусмотрена иерархия пространств имен, мы можем импортировать интересующее нас пространство имен в тот или иной файл, используя ключевое слово use.

Если вы добавите следующий код в свой index.php, класс Math\Geometry\Circle будет импортирован в текущую область:

<?php
use Math\Geometry\Circle;

$circle = new Circle(5);  // класс Circle теперь находится в этом пространстве имен

echo $circle -> getDiameter();    // 10
echo "<br>";
echo $circle -> getArea();      // 78.5
echo "<br>";
echo $circle -> getCircumference(); // 31.4
?>

Вы можете импортировать как пространства имен, так и классы:

Пример

<?php
use Math\Geometry; // импорт пространства имен
use Math\Geometry\Circle; // импорт класса
?>

Может быть полезно присвоить пространству имен или классу псевдоним:

  • Если у вас уже есть класс с таким же именем, как у импортируемого класса
  • Когда вам нужно более удобное (или простое) имя для импортируемого класса
Такое присвоение осауществляется с помощью ключевого слова use:

Пример

<?php
use Math\Geometry\Circle as Circ;

$circle = new Circ(5);
?>

В примере выше мы присвоили псевдоним Circ классу Circle.

Аналогично можно присвоить псевдоним пространству имен.