Задание аргументов типа объекта PHP значением по умолчанию - PullRequest
3 голосов
/ 18 декабря 2008

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

Ответы [ 2 ]

2 голосов
/ 18 декабря 2008

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

0 голосов
/ 09 июля 2015

Вы можете использовать мою крошечную библиотеку 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)

Проверьте документы для большего количества примеров

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...