Я пишу приложение 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 или есть другой способ присвоить аргументам объектного типа значение по умолчанию?






Конечно, вам лучше использовать контейнер IoC / DIP для выполнения этой работы. Ваш код выше (операторы if) увеличивают связь классов. Класс клиента (Engine) не должен заботиться о том, что реализует роли загрузчика и регистратора. Это должна знать фабрика или контейнер DIP. Поместив в код конкретное имя класса и связав классы вместе, вы сделаете код менее гибким (гибким), менее пригодным для повторного использования и, следовательно, менее удобным в обслуживании.
Спасибо за Ваш ответ. У вас есть рекомендации по выбору хорошего PHP-контейнера?
В этом случае вы можете использовать мою крошечную библиотеку 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)
Проверьте документы для получения дополнительных примеров
В этом случае вы можете использовать мою крошечную библиотеку ValueResolver, чтобы сделать ее более компактной