HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <h2>Пространства имен</h2>
1 <h2>Пространства имен</h2>
2 <p>Любой современный PHP-код вызывается с указанием пространства имен. Не важно, о каком коде идет речь - это может быть вызов кода из файла в соседней директории или из установленной зависимости. Это касается любой библиотеки, включая те, которые пишем мы сами. По этой причине нужно как-то выбрать имя пространства имен.</p>
2 <p>Любой современный PHP-код вызывается с указанием пространства имен. Не важно, о каком коде идет речь - это может быть вызов кода из файла в соседней директории или из установленной зависимости. Это касается любой библиотеки, включая те, которые пишем мы сами. По этой причине нужно как-то выбрать имя пространства имен.</p>
3 <p>Имя пакета отображается в имени пространства имен таким образом - Dependency\Injection, где дефис заменяется на обратный слеш \, а каждое слово начинается с заглавной буквы.</p>
3 <p>Имя пакета отображается в имени пространства имен таким образом - Dependency\Injection, где дефис заменяется на обратный слеш \, а каждое слово начинается с заглавной буквы.</p>
4 - <p>К сожалению, пространства имен в языке появились не сразу, поэтому PHP позволяет создавать файловую структуру и структуру пространств имен независимо. Кроме того, в разных пакетах есть разные способы именования файлов, формирования самих имен пакетов, организации файлов внутри пакета. По этой причине мы старались использовать в<a>php-package</a>самые распространенные практики, которые максимально похожи на то, как все организовано в других языках:</p>
4 + <p>К сожалению, пространства имен в языке появились не сразу, поэтому PHP позволяет создавать файловую структуру и структуру пространств иен независимо. Кроме того, в разных пакетах есть разные способы именования файлов, формирования самих имен пакетов, организации файлов внутри пакета. По этой причине мы старались использовать в<a>php-package</a>самые распространенные практики, которые максимально похожи на то, как все организовано в других языках:</p>
5 <ul><li>Пакет именуется в стиле<em>kebab-case</em></li>
5 <ul><li>Пакет именуется в стиле<em>kebab-case</em></li>
6 <li>Каждый пакет может выставлять наружу только одно пространство имен, что снижает риск пересечения с другими пакетами и позволяет легко определить принадлежность пространства имен к пакету. В терминах стандарта PSR-4 такое пространство имен называется<em>vendor namespace</em></li>
6 <li>Каждый пакет может выставлять наружу только одно пространство имен, что снижает риск пересечения с другими пакетами и позволяет легко определить принадлежность пространства имен к пакету. В терминах стандарта PSR-4 такое пространство имен называется<em>vendor namespace</em></li>
7 <li>Пространства имен именуются в стиле<a>StudlyCaps</a>и напрямую отображаются на файловую систему. Единственное исключение - это корневое пространство имен, которое получается путем трансформации имени пакета</li>
7 <li>Пространства имен именуются в стиле<a>StudlyCaps</a>и напрямую отображаются на файловую систему. Единственное исключение - это корневое пространство имен, которое получается путем трансформации имени пакета</li>
8 <li>Исходный код проекта находится в папке<em>src</em>, а тесты - в директории<em>tests</em></li>
8 <li>Исходный код проекта находится в папке<em>src</em>, а тесты - в директории<em>tests</em></li>
9 </ul><p>Что касается именования файлов: что бы ни хранилось внутри, придерживайтесь именования в стиле<em>StudlyCaps</em>. На практике такие названия выглядят так: MySuperFile.php.</p>
9 </ul><p>Что касается именования файлов: что бы ни хранилось внутри, придерживайтесь именования в стиле<em>StudlyCaps</em>. На практике такие названия выглядят так: MySuperFile.php.</p>
10 <h2>Автозагрузка</h2>
10 <h2>Автозагрузка</h2>
11 <p>В предыдущем уроке мы создали файл<em>src/Runner.php</em>. Мы попытались запустить функции, которые он содержит - например, подключить соответствующий неймспейс в файл<em>index.php</em>. В итоге все завершилось с ошибкой.</p>
11 <p>В предыдущем уроке мы создали файл<em>src/Runner.php</em>. Мы попытались запустить функции, которые он содержит - например, подключить соответствующий неймспейс в файл<em>index.php</em>. В итоге все завершилось с ошибкой.</p>
12 <p>Дело в том, что попытка использовать любой сторонний код или другие файлы, принадлежащие текущему пакету, требует загрузки этих файлов. Указание пространства имен никак не влияет на их загрузку.</p>
12 <p>Дело в том, что попытка использовать любой сторонний код или другие файлы, принадлежащие текущему пакету, требует загрузки этих файлов. Указание пространства имен никак не влияет на их загрузку.</p>
13 <p>По умолчанию считается, что если вы пытаетесь использовать какой-то код, то он уже загружен, используя require или require_once. Чисто технически, можно так и делать. Каждый раз, когда нам нужно использовать сторонний код, мы можем сначала делать его подгрузку через require. К счастью, этого делать не нужно. Более того, линтер ругается на попытку использовать require самостоятельно.</p>
13 <p>По умолчанию считается, что если вы пытаетесь использовать какой-то код, то он уже загружен, используя require или require_once. Чисто технически, можно так и делать. Каждый раз, когда нам нужно использовать сторонний код, мы можем сначала делать его подгрузку через require. К счастью, этого делать не нужно. Более того, линтер ругается на попытку использовать require самостоятельно.</p>
14 <p>Дело в том, что Composer умеет автоматически загружать все необходимые файлы. Эта функциональность частично опирается на возможности автозагрузки самого PHP. Мы еще не проходили классы, но стандарт PSR-4 описывает автозагрузку именно классов. Грубо говоря, если правильно сконфигурировать автозагрузчик, то мы можем просто добавить новый файл с классом, и он загрузится автоматически. В случае с файлами, в которых есть только пространство имен и функции, все чуть сложнее. Каждый новый файл должен быть прописан внутри composer.json, только тогда он будет загружен. Вот как это выглядит:</p>
14 <p>Дело в том, что Composer умеет автоматически загружать все необходимые файлы. Эта функциональность частично опирается на возможности автозагрузки самого PHP. Мы еще не проходили классы, но стандарт PSR-4 описывает автозагрузку именно классов. Грубо говоря, если правильно сконфигурировать автозагрузчик, то мы можем просто добавить новый файл с классом, и он загрузится автоматически. В случае с файлами, в которых есть только пространство имен и функции, все чуть сложнее. Каждый новый файл должен быть прописан внутри composer.json, только тогда он будет загружен. Вот как это выглядит:</p>
15 <p>В файл composer.json добавляется секция autoload. Внутрь этой секции добавляется еще одна секция files. Она в свою очередь содержит список файлов, которые надо загрузить. После обновления секции autoload нужно обязательно запускать команду composer dump-autoload. Она генерирует необходимый код в директории vendor, реализующий указанную загрузку. Затем остается только один шаг. Чтобы ваш код начал использовать все, что сделал Composer, необходимо в начале вашего кода прописать следующую строку:</p>
15 <p>В файл composer.json добавляется секция autoload. Внутрь этой секции добавляется еще одна секция files. Она в свою очередь содержит список файлов, которые надо загрузить. После обновления секции autoload нужно обязательно запускать команду composer dump-autoload. Она генерирует необходимый код в директории vendor, реализующий указанную загрузку. Затем остается только один шаг. Чтобы ваш код начал использовать все, что сделал Composer, необходимо в начале вашего кода прописать следующую строку:</p>
16 <p>Конкретный путь зависит от того, где находится директория vendor. При работе с локальным проектом Composer по умолчанию создаст директорию vendor в его корне. Но в случае глобальной установки пакета путь к директории vendor будет другим. Его можно узнать, выполнив команду в терминале:</p>
16 <p>Конкретный путь зависит от того, где находится директория vendor. При работе с локальным проектом Composer по умолчанию создаст директорию vendor в его корне. Но в случае глобальной установки пакета путь к директории vendor будет другим. Его можно узнать, выполнив команду в терминале:</p>
17 <p>После установки сам пакет, его зависимости и файл autoload.php будут созданы именно в этой директории. Путь, который мы указали выше, уже не сработает, потому что при глобальной установке путь к директории vendor отличается. Чтобы файл autoload.php был найден в любом случае, используют следующую запись:</p>
17 <p>После установки сам пакет, его зависимости и файл autoload.php будут созданы именно в этой директории. Путь, который мы указали выше, уже не сработает, потому что при глобальной установке путь к директории vendor отличается. Чтобы файл autoload.php был найден в любом случае, используют следующую запись:</p>
18  
18