Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

Пространства имён

Любой код на PHP, написанный в современном стиле, вызывается с указанием пространства имён. Не важно, о каком коде идёт речь, будь то вызов кода из файла, лежащего в соседнем файле, или вызов кода из установленной зависимости. Давайте ещё раз посмотрим на код из предыдущего примера:

<?php

namespace My\Project\Runner;

use Illuminate\Support\Collection;

function run()
{
    $collection = collect(['taylor', 'abigail', null])->map(function ($name) {
        return strtoupper($name);
    });

    return $collection;
}

Как видите, для использования collect мы указываем использовать пространство имён Illuminate\Support\Collection. То же самое касается любой другой библиотеки, включая те, которые пишем мы сами. По этой причине нужно как-то выбрать имя пространства имён. Имя пакета отображается в имени пространства имён таким образом — Dependency\Injection, где дефис заменяется на \ (обратный слеш), а каждое слово начинается с заглавной буквы.

К сожалению, из-за того, что пространства имён в языке появились не сразу, PHP позволяет создавать файловую структуру и структуру пространств имён независимо. Кроме того, в разных пакетах разные способы именования файлов, разные способы формирования самих имён пакетов, разные способы организации файлов внутри пакета. По этой причине я постарался использовать в php-package те практики, которые наиболее распространены и похожи на то, как всё организовано в других языках.

  • Пакет именуется в "шашлычной нотации" (kebab-case).
  • Каждый пакет может выставлять наружу только одно пространство имён, что снижает риск пересечения с другими пакетами, а также позволяет легко определить принадлежность пространства имён к пакету. В терминологии стандарта PSR-4, такое пространство имён называется "vendor namespace".
  • Пространства имён именуются в стиле StudlyCaps и напрямую отображаются на файловую систему. Исключением является корневое пространства имён, которое получается путём трансформации имени пакета.
  • Исходный код проекта находится в папке src, а тесты в директории tests.

Что касается именования файлов, то, что бы ни хранилось внутри, придерживайтесь именования в стиле StudlyCaps (например, MySuperFile.php).

Автозагрузка

В предыдущем уроке мы создали файл src/Runner.php, но я сказал, что попытка запустить его завершится с ошибкой. Дело в том, что попытка использовать любой сторонний код, включая другие файлы, принадлежащие текущему пакету, требует загрузки этих файлов. Указание пространства имён, само по себе, никак не влияет на их загрузку. По умолчанию считается, что если вы пытаетесь использовать какой-то код, то он уже загружен, используя require или require_once. Чисто технически можно так и делать. Каждый раз, когда нам нужно использовать сторонний код, мы можем сначала делать его подгрузку через require. К счастью, этого делать не нужно. Более того, линтер ругается на попытку использовать require самостоятельно.

Дело в том, что Composer умеет автоматически загружать все необходимые файлы. Эта функциональность частично опирается на возможности автозагрузки самого PHP. Мы ещё не проходили классы, но стандарт PSR-4 описывает автозагрузку именно классов. Грубо говоря, если правильно сконфигурировать автозагрузчик, то при добавлении нового файла с классом, тот будет загружен автоматически. В случае с файлами, в которых есть только пространство имён и функции, всё чуть сложнее. Каждый новый файл должен быть прописан внутри composer.json, только тогда он будет загружен. Вот как это выглядит:

{
    "name": "hexlet/pairs",
    "autoload": {
        "files": [
            "src/Pairs.php",
            "src/Lists.php"
        ]
    }
}

В файл composer.json добавляется секция autoload, внутрь которой добавляется ещё одна секция files, которая в свою очередь содержит список файлов, которые надо загрузить. После обновления секции autoload нужно обязательно запускать команду composer dump-autoload. Она генерирует необходимый код в папке vendor, реализующий указанную загрузку. Затем остаётся только один шаг. Чтобы ваш код начал использовать всё, что сделал Composer, необходимо в начале вашего кода прописать следующую строку: require __DIR__ . '/../vendor/autoload.php';.

Самостоятельная работа

  • Склонируйте пакет (как обычный git-репозиторий) php-package и перейдите в него
  • Выполните установку зависимостей командой composer install
  • Запустите проект на выполнение bin/php-package. Если всё пройдёт успешно, программа спросит ваше имя.
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →