Menu
Coddy logo textTech

Введение в пространства имён

Часть раздела Объектно-ориентированное программирование путешествия по 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).

challenge icon

Задание

Легко

Давайте организуем небольшое приложение с помощью namespace, чтобы предотвратить конфликты имён между class с одинаковыми именами.

Представьте, что вы создаёте систему, которая работает и с транспортными средствами, и с животными. В обеих областях есть сущность под названием Car: одна представляет настоящий автомобиль, а другая — домашнюю кошку по имени "Car" (да, некоторые люди именно так называют своих кошек!).

Вы создадите три файла:

  • Vehicle/Car.php: Define Car class в namespace Vehicle со свойством public $brand. Конструктор должен принимать название марки и сохранять его. Add метод describe(), который returns "Vehicle: [brand]".
  • Animal/Car.php: Define Car class в namespace Animal (это кошка по имени 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() для каждого объекта (каждый на своей строке)

?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор PHP