Введение в пространства имен
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 10 из 91.
По мере роста ваших PHP-проектов вы будете создавать множество классов. Что произойдет, если у двух классов будут одинаковые имена?
Например, у вас может быть класс User для вашего блога и другой класс User для вашего магазина. Пространства имен решают эту проблему, организуя классы в логические группы.
Пространство имен — это как папка для ваших классов. Вы объявляете его в начале вашего PHP-файла с помощью ключевого слова namespace:
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
Теперь у вас может быть другой класс User в другом пространстве имен:
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
Чтобы использовать класс в пространстве имен, вы обращаетесь к нему по его полному пути, используя обратную косую черту:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
Вывод:
Alice
alice@example.com
Обратная косая черта \ разделяет уровни пространств имен, подобно тому, как косая черта разделяет папки в пути к файлу. Вы также можете создавать вложенные пространства имен, такие как App\Models\Blog, для более глубокой организации.
Ключевой момент: Пространства имен предотвращают конфликты имен и обеспечивают организованность вашего кода. Всегда объявляйте пространство имен перед любым другим кодом в вашем файле (за исключением инструкций declare).
Задание
ЛегкоДавайте организуем небольшое приложение, используя пространства имен (namespaces), чтобы предотвратить конфликты имен между классами с одинаковыми названиями.
Представьте, что вы создаете систему, которая работает как с транспортными средствами, так и с животными. В обеих областях есть сущность под названием Car — одна представляет собой настоящий автомобиль, а другая — домашнего кота по кличке "Car" (да, некоторые люди так называют своих котов!).
Вам нужно создать три файла:
Vehicle/Car.php— Определите классCarв пространстве именVehicleс публичным свойствомpublic $brand. Конструктор должен принимать название бренда и устанавливать его. Добавьте методdescribe(), который возвращает"Vehicle: " . $this->brand.Animal/Car.php— Определите классCarв пространстве именAnimal(это кот по кличке Car!). У него должно быть публичное свойствоpublic $age. Конструктор принимает возраст и устанавливает его. Добавьте методdescribe(), который возвращает"Cat named Car, age: " . $this->age.main.php— Подключите оба файла классов с помощьюrequire_once. Создайте по одному объекту из каждого пространства имен, используя их полные пути пространств имен, затем выведите результат вызоваdescribe()для каждого объекта (каждый на новой строке).
В main.php создайте:
- Объект
Vehicle\Carс брендом"Toyota" - Объект
Animal\Carс возрастом3
Не забудьте использовать обратную косую черту \ для обращения к классам в пространствах имен по их полному пути при создании объектов.
Шпаргалка
Пространства имен организуют классы в логические группы и предотвращают конфликты имен, когда несколько классов имеют одинаковое имя.
Объявите пространство имен в начале PHP-файла с помощью ключевого слова namespace:
<?php
namespace Blog;
class User {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
Вы можете иметь классы с одинаковыми именами в разных пространствах имен:
<?php
namespace Shop;
class User {
public $email;
public function __construct($email) {
$this->email = $email;
}
}
Чтобы использовать класс из пространства имен, обратитесь к нему по полному пути, используя обратную косую черту \:
<?php
$blogUser = new \Blog\User("Alice");
$shopUser = new \Shop\User("alice@example.com");
echo $blogUser->name . "\n";
echo $shopUser->email . "\n";
Обратная косая черта разделяет уровни пространства имен, подобно путям к папкам. Вы можете создавать вложенные пространства имен, такие как App\Models\Blog.
Важно: Всегда объявляйте пространство имен перед любым другим кодом в вашем файле (за исключением операторов declare).
Попробуйте сами
<?php
// Подключите файлы классов
require_once 'Vehicle/Car.php';
require_once 'Animal/Car.php';
// TODO: Создайте объект Vehicle\Car с маркой "Toyota"
// Не забудьте использовать полный путь пространства имен с обратным слешем
// TODO: Создайте объект Animal\Car с возрастом 3
// Не забудьте использовать полный путь пространства имен с обратным слешем
// TODO: Выведите результат describe() для каждого объекта (каждый на новой строке)
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy