Composer: autoload, use, namespace
Glossary overview

Composer: autoload, use, namespace

Где посмотреть все пакеты для PHP?

На официальном сайте Composer/Packagist:

🔗 https://packagist.org

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\ClassNamepath/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\MyLoggerinc/Logging/MyLogger.php

💡 А так как у тебя файл лежит в inc/logic/, то имя неймспейса должно быть:

namespace SyntaxSteps\Logic;

❗️Не Logging, а Logic! (если ты не хочешь путаницы).

Итого: как строится namespace

ЧтоПочему
SyntaxSteps\LogicSyntaxSteps — префикс из composer.json
Logic — соответствует подпапке inc/logic/
MyLogger.phpФайл с одноимённым классом внутри
Файл: inc/logic/MyLogger.php100% соответствует namespace

Не забудь:

После любых изменений в composer.json нужно выполнить:

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