Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

Давайте организуем небольшое приложение, используя пространства имен (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() для каждого объекта (каждый на новой строке)

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

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

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

2Пространства имен и автозагрузка

Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект