Предоставление аргументам объектного типа PHP значения по умолчанию

Я пишу приложение PHP с учетом возможности тестирования, поэтому мои классы всегда запрашивают в своих конструкторах «объекты-участники», от которых они зависят, в отношении шаблона внедрения зависимостей.

Таким образом, я могу использовать макеты или тестовые реализации в своих модульных тестах.

Однако я хочу получить возможность создать экземпляр класса с нулевыми значениями, переданными его аргументам конструктора, чтобы запустить резервный механизм, который создает экземпляр класса реализации по умолчанию для каждого соавтора.

Поскольку параметрам объектного типа нельзя присвоить значение по умолчанию в PHP, я должен сделать это внутри конструктора. Следующий код является примером подхода, который я сейчас использую:

class Engine
{
    private $loader;
    private $logger;

    public function __construct(ResourceLoader $loader = null, Logger $logger = null)
    {
        if ($loader == null) $loader = new DefaultResourceLoader;
        if ($logger == null) $logger = new DefaultLogger;

        $this->loader = $loader;
        $this->logger = $logger;
    }
}

Что ты думаешь об этом ? Должен ли я использовать вместо этого контейнер IoC или есть другой способ присвоить аргументам объектного типа значение по умолчанию?

В этом случае вы можете использовать мою крошечную библиотеку ValueResolver, чтобы сделать ее более компактной

Victor Bocharsky 09.07.2015 13:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
1
2 249
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Конечно, вам лучше использовать контейнер IoC / DIP для выполнения этой работы. Ваш код выше (операторы if) увеличивают связь классов. Класс клиента (Engine) не должен заботиться о том, что реализует роли загрузчика и регистратора. Это должна знать фабрика или контейнер DIP. Поместив в код конкретное имя класса и связав классы вместе, вы сделаете код менее гибким (гибким), менее пригодным для повторного использования и, следовательно, менее удобным в обслуживании.

Спасибо за Ваш ответ. У вас есть рекомендации по выбору хорошего PHP-контейнера?

Franck 18.12.2008 19:06

В этом случае вы можете использовать мою крошечную библиотеку ValueResolver, например:

$logger = ValueResolver::resolve($logger, new DefaultLogger);

и не забудьте использовать пространство имен use LapaLabs\ValueResolver\Resolver\ValueResolver;

Также есть возможность приведения типов, например, если значение вашей переменной должно быть integer, поэтому используйте это:

$id = ValueResolver::toInteger('6 apples', 1); // returns 6
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value)

Проверьте документы для получения дополнительных примеров

Другие вопросы по теме