Введение в пространства имён
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 10 из 91.
По мере роста ваших PHP-проектов вы будете создавать множество классов. Что произойдёт, если два класса будут иметь одинаковое имя?
Например, у тебя может быть класс User для блога и другой класс User для магазина. Пространства имён решают эту проблему, организуя классы в логические группы.
namespace похож на папку для ваших классов. Вы объявляете его в верхней части 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;
}
}
Чтобы использовать класс с пространством имён, укажите на него, используя его полный path и обратную косую черту:
<?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
Обратная косая черта \ разделяет уровни namespace, подобно тому как косые черты разделяют папки в файловом path. Также можно создавать вложенные namespace, например App\Models\Blog, для более глубокой организации.
Ключевой момент: Конструкции namespace предотвращают конфликты имен и помогают поддерживать порядок в коде. Всегда объявляй namespace перед любым другим кодом в файле (за исключением операторов declare).
Задание
ЛегкоДавайте организуем небольшое приложение с помощью namespace, чтобы предотвратить конфликты имён между class с одинаковыми именами.
Представьте, что вы создаёте систему, которая работает и с транспортными средствами, и с животными. В обеих областях есть сущность под названием Car: одна представляет настоящий автомобиль, а другая — домашнюю кошку по имени "Car" (да, некоторые люди именно так называют своих кошек!).
Вы создадите три файла:
Vehicle/Car.php: DefineCarclass в namespaceVehicleсо свойствомpublic $brand. Конструктор должен принимать название марки и сохранять его. Add методdescribe(), который returns"Vehicle: [brand]".Animal/Car.php: DefineCarclass в namespaceAnimal(это кошка по имени Car!). У него должно быть свойствоpublic $age. Конструктор принимает возраст и сохраняет его. Add методdescribe(), который returns"Cat named Car, age: [age]".main.php: Include оба файла class с помощьюrequire_once. Создайте по одному object из каждого namespace, используя их полные пути namespace, затем выведите result вызоваdescribe()для каждого object (каждый результат в собственной строке).
В main.php создайте:
Vehicle\Carс маркой"Toyota"Animal\Carс возрастом3
Remember использовать backslash \, чтобы обращаться к class из namespace по их полному пути при создании object.
Попробуйте сами
<?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Модификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP