Где посмотреть все пакеты для PHP?
На официальном сайте Composer/Packagist:
Composer надо скачивать? Да, Composer нужно установить на компьютер — это отдельная программа (как npm или pip), которая управляет зависимостями PHP-проектов.
У меня установлен:

Инициализируем Composer в папке темы.
composer init
Ответь на вопросы (можно просто нажимать Enter). В результате появится файл composer.json.

Можем теперь установить пакет.
Попробуем поставить пакет monolog/monolog — это мощная библиотека для логирования в PHP, которую используют даже такие фреймворки, как Laravel и Symfony. С ней ты научишься писать логи в файлы, в браузер, в консоль и даже в Slack или Telegram (если захочешь).

Это создаст папку vendor/ и создаст файл composer.lock

Теперь сделаем файлик php и можем писать в нем код.
<?php
require dirname(__DIR__, 2) . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// Абсолютный путь к logs/app.log в корне темы
$logPath = dirname(__DIR__, 2) . '/logs/app.log';
// Проверка: папка существует?
if (!is_dir(dirname($logPath))) {
mkdir(dirname($logPath), 0777, true);
}
$log = new Logger('my_app');
$log->pushHandler(new StreamHandler($logPath, Logger::DEBUG));
$log->info('Информация для отладки');
$log->warning('Это предупреждение');
$log->error('Произошла ошибка');
$log->debug('Подробный лог с переменными', ['user_id' => 123]);
echo "✅ Логи записаны в $logPath\n";
Запускаем в терминале.
PS D:\OSPanel\domains\syntaxsteps\wp-content\themes\syntaxsteps> php inc/logic/test.php
✅ Логи записаны в D:\OSPanel\domains\syntaxsteps\wp-content\themes\syntaxsteps/logs/app.log

Важные моменты.
А я могу вместо этого :
require dirname(DIR, 2) . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
Сразу импортировать через require Logger и StreamHandler без autoload и use?
Кратко: теоретически — да, но практически — нет.
Если ты используешь Composer, нельзя просто “require’нуть” файл класса напрямую, как в старом PHP без Composer.
Почему нельзя просто require 'Logger.php'?
Потому что:
- Composer устанавливает Monolog внутрь папки
vendor/со сложной структурой. - Файлы классов расположены по PSR-4 namespace структуре, например:
vendor/monolog/monolog/src/Monolog/Logger.php
vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
👉 И эти классы не предназначены для ручного подключения require-ом, потому что:
- они используют
namespace Monolog;,Monolog\Handler, и т.д. - ты должен использовать их через автозагрузку
require 'vendor/autoload.php'; // обязательно
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
** Просто можем глобально вынести require ‘vendor/autoload.php’; в functions.php, как в Pt-luna.

Как работает autoload.php
Когда ты вызываешь:
use Monolog\Logger;
и предварительно подключил vendor/autoload.php, Composer автоматически:
- найдёт файл
Logger.phpвvendor/monolog/monolog/src/Monolog/Logger.php - загрузит его в момент первого использования
Так не работает:
require 'vendor/monolog/monolog/src/Monolog/Logger.php'; // НЕ РАБОТАЕТ без autoload
$log = new \Monolog\Logger('my_app'); // А может даже выбросить ошибку, если зависимости не подгружены
Итого
| Вопрос | Ответ |
|---|---|
| Можно ли подключать классы без autoload? | ❌ Нет, если это сторонние библиотеки из Composer |
Обязательно ли use? | ✅ Нет, можно писать полный путь: new \Monolog\Logger() |
| Но autoload нужен? | ✅ Да, vendor/autoload.php обязателен |
Можно ли вручную подключать Logger.php? | ❌ Нет, ты нарушишь PSR-4 структуру и зависимые классы не загрузятся |
Если уберем autoload, получим ошибку.
<?php
//require dirname(__DIR__, 2) . '/vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// OUTPUT
PS D:\OSPanel\domains\syntaxsteps\wp-content\themes\syntaxsteps> php inc/logic/test.php
PHP Fatal error: Uncaught Error: Class "Monolog\Logger" not found in D:\OSPanel\domains\syntaxsteps\wp-content\themes\syntaxsteps\inc\logic\test.php:15
Stack trace:
#0 {main}
thrown in D:\OSPanel\domains\syntaxsteps\wp-content\themes\syntaxsteps\inc\logic\test.php on line 15
Fatal error: Uncaught Error: Class "Monolog\Logger" not found in D:\OSPanel\domains\syntaxsteps\wp-content\themes\syntaxsteps\inc\logic\test.php:15
Stack trace:
#0 {main}
thrown in D:\OSPanel\domains\syntaxsteps\wp-content\themes\syntaxsteps\inc\logic\test.php on line 15
Можно без Use, но тогда придется писать полные пути – Monolog\Logger и Monolog\Handler\StreamHandler.
<?php
require dirname(__DIR__, 2) . '/vendor/autoload.php';
//use Monolog\Logger;
//use Monolog\Handler\StreamHandler;
// Абсолютный путь к logs/app.log в корне темы
$logPath = dirname(__DIR__, 2) . '/logs/app.log';
// Проверка: папка существует?
if (!is_dir(dirname($logPath))) {
mkdir(dirname($logPath), 0777, true);
}
$log = new Monolog\Logger('my_app');
$log->pushHandler(new Monolog\Handler\StreamHandler($logPath, Monolog\Logger::DEBUG));
$log->info('Информация для отладки');
$log->warning('Это предупреждение');
$log->error('Произошла ошибка');
$log->debug('Подробный лог с переменными', ['user_id' => 123]);
echo "✅ Логи записаны в $logPath\n";
Что такое namespace в PHP?
namespace — это пространство имён, которое помогает:
- группировать код логически (как папки для классов и функций),
- избегать конфликтов имён между разными библиотеками,
- организовать автозагрузку через Composer (
PSR-4стандарт).
📦 Пример без namespace:
class Logger {
// конфликт с Monolog\Logger
}
Если ты подключишь Monolog\Logger и свой Logger — будет конфликт.
Пример с namespace:
namespace MyTheme\Logging;
class Logger {
// теперь это MyTheme\Logging\Logger
}
Теперь можно использовать оба класса:
use Monolog\Logger;
use MyTheme\Logging\Logger as MyLogger;
Как ты можешь использовать namespace в своём коде
Допустим, у тебя есть файл inc/logic/logger.php.
Ты хочешь, чтобы это был самостоятельный класс.
🔧 Структура:
wp-content/themes/syntaxsteps/
├── inc/
│ └── logic/
│ └── MyLogger.php
├── functions.php
└── composer.json
Шаг 1: Создай класс с namespace
<?php
// inc/logic/MyLogger.php
namespace SyntaxSteps\Logging;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
class MyLogger {
public static function create(): Logger {
$logPath = dirname(__DIR__, 2) . '/logs/app.log';
if (!is_dir(dirname($logPath))) {
mkdir(dirname($logPath), 0777, true);
}
$log = new Logger('syntaxsteps');
$log->pushHandler(new StreamHandler($logPath, Logger::DEBUG));
return $log;
}
}
** Тут ошибка.
namespace должен соответствовать структуре папок, если ты используешь PSR-4 автозагрузку через Composer.
Если SyntaxSteps\ мапится на inc/, то:
SyntaxSteps\Logic\MyLogger
→ ищется в inc/Logic/MyLogger.php ✅
SyntaxSteps\Logging\MyLogger
→ ищется в inc/Logging/MyLogger.php ❌ ← не соответствует твоей структуре
PHP не чувствителен к регистру при use и namespace.
Шаг 2: Зарегистрируй namespace в composer.json
{
"autoload": {
"psr-4": {
"SyntaxSteps\\": "inc/"
}
}
}
Затем выполни в терминале:
composer dump-autoload
Теперь Composer знает, где искать SyntaxSteps\Logging\MyLogger.
Шаг 3: Используй класс
require dirname(__DIR__, 2) . '/vendor/autoload.php';
use SyntaxSteps\Logging\MyLogger;
$log = MyLogger::create();
$log->info('Лог из собственного класса');
Какой принцип нейминга Namespace.
NamespacePrefix\SubNamespace\ClassName → path/to/base/SubNamespace/ClassName.php
"autoload": {
"psr-4": {
"SyntaxSteps\\": "inc/"
}
}
Это означает:
Все классы, начинающиеся с
SyntaxSteps\, ищи в папкеinc/.
Пример структуры:
syntaxsteps/
├── inc/
│ └── logic/
│ └── MyLogger.php
├── composer.json
А внутри файла MyLogger.php:
namespace SyntaxSteps\Logging;
class MyLogger { ... }
Как это сопоставляется?
SyntaxSteps\Logging\MyLogger- ⇒
inc/(изcomposer.json) + - ⇒
Logging\MyLogger⇒inc/Logging/MyLogger.php
💡 А так как у тебя файл лежит в
inc/logic/, то имя неймспейса должно быть:namespace SyntaxSteps\Logic;
❗️Не Logging, а Logic! (если ты не хочешь путаницы).
Итого: как строится namespace
| Что | Почему |
|---|---|
SyntaxSteps\Logic | SyntaxSteps — префикс из composer.json |
Logic — соответствует подпапке inc/logic/ | |
MyLogger.php | Файл с одноимённым классом внутри |
Файл: inc/logic/MyLogger.php | 100% соответствует namespace |

Не забудь:
После любых изменений в composer.json нужно выполнить:
composer dump-autoload
| Без namespace | С namespace |
|---|---|
| Всё в одной куче | Код структурирован по логике и папкам |
| Возможны конфликты | Пространства имён их предотвращают |
| Нет автозагрузки своих классов | Автозагрузка по PSR-4 через Composer |