$dep and $this->dep = $dep;
class Foo {
protected $dep=null;
public function __construct(IDep $dep = null) {
$this->dep = $dep ?: new DefaultDep;
}
}
$class->setParser(function() {
$query = $this->getQuery();
///
});
8-( )По определению конструктора.
СПГС detectedконструктор класса — специальный блок инструкций, вызываемый при создании объекта. задача — инициализировать члены объекта и определить инвариант класса
А статьи надо читать полностью:Во всяком случае, в моём понимании, конструктор должен создавать валидный объект: http://martinfowler.com/articles/injection.html#ConstructorVersusSetterInjection. Это подход правильнее, но не всегда удобнее. А уж в приведённом примере, очевидно, никаких неудобств нет.
но в PHP перегрузка методов невозможна и многовариантная инициализация через конструктор неудобна в отличие от языка, на котором пишет ФаулерConstructors with parameters give you a clear statement of what it means to create a valid object in an obvious place. If there's more than one way to do it, create multiple constructors that show the different combinations.
а всего несколько часов час назад былоТо есть я не против того или иного. Если объект опциональный, то лучше как раз через setter.
Через конструктор по-любому лучше.
правильнее через конструктор
прости, но я не учитель, я могу объяснить почему я считаю, что здесь setter лучше и при чем тут tell don't ask, но я не претендую на то, чтобы учить кого-тоТы ж к чему-то тут приплёл «tell, don't ask». А к чему — так и не объяснил. А ведь так хотелось послушать учителя.
Если 4, то можно сделать ValueObject, там и типизация будет. Но раз уж их 4, то проще setter'ами, да.в отдельные классы можно вынести 4 объекта
Ну, Гриша, опять троллишь, ай-яй-яй. Парсер — обязательная зависимость, а не опциональная.а всего несколько часов час назад было
class Foo {
static public function constructByBlahBlah(...) {
$self = new static;
$self->setBlah(...);
return $self;
}
}
да, я некорректен, проститеА, так grigori понимает под tell, don't ask что-то своё, тогда ладно.
то естьЕсли 4, то можно сделать ValueObject, там и типизация будет. Но раз уж их 4, то проще setter'ами, да.
$params = new SafeDbParams();
$params->setParser($MyParser);
new SafeDb($params);
а что, только тебе можно?Ну, Гриша, опять троллишь, ай-яй-яй. Парсер — обязательная зависимость, а не опциональная.
Вообще-то тогда пора задуматься о декомпозиции, а не лепить десяток новых setter'ов.а "их" почему-то всегда много, и если сейчас параметр один - то через месяц почти всегда добавится еще