Загрузка классов PHP, просто поместив файлы в каталог PSR-4 - PullRequest
0 голосов
/ 20 февраля 2019

В моей текущей библиотеке у меня есть классы со статическим кодом вне определения класса, которые я хотел бы выполнить при просмотре файла index.php с автозагрузкой (с правильным размещением файлов классов в структуре папок PSR-4,и звонит composer install раньше).

Это не такая уж плохая сделка.Например, в моем пользовательском классе Error.php я мог, например, вызвать функцию set_error_handler вне класса, чтобы предупреждения можно было перехватить.А помещение этого файла в автозагрузку PSR-4 может облегчить боль, вызванную отсутствием необходимости вызывать код Error.php в index.php, чтобы включить эту перехват.Каждый источник, который просто использует мое пространство имен и автоматически загружает мою библиотеку, будет иметь это как должное.

Я пытался включить use \MyNamespace\Error; в файл index.php, но код в Error.php, вне определения класса Error, не выполняется автоматически.

Код вне класса выполняется только тогда, когда я вызываю метод класса внутри моего файла index.php (тот, который имеет автозагрузку) .

Можно ли это сделать?Спасибо за ваше время.

1 Ответ

0 голосов
/ 20 февраля 2019

use \MyNamespace\Error; не запускает автозагрузку, просто позволяет использовать более короткое имя класса в коде - new Error() вместо new \MyNamespace\Error().Если вы хотите включить файл Error.php, вам нужно использовать этот класс.Вероятно, самый безопасный способ - использовать class_exist():

class_exists(Error::class);

Но, честно говоря, вам следует переосмыслить свой дизайн, неявная регистрация обработчика ошибок в файле с объявлением класса против PSR-1 и может сильно раздражать в большом проекте.

Файлы ДОЛЖНЫ либо объявлять символы (классы, функции, константы и т. Д.), Либо вызывать побочные эффекты (например, генерировать выходные данные, изменять настройки .ini и т. Д.), Но НЕ ДОЛЖНЫ выполнять оба действия

https://www.php -fig.org / psr / psr-1 / # 23-побочные эффекты

Это было бы менее волшебно, если бывы создаете отдельный метод для регистрации обработчика ошибок и явно вызываете его в index.php:

Error::registerErrorHandler();
...