Сборщик аргументов конструктора

Рейтинг: 0Ответов: 2Опубликовано: 08.10.2014

Есть ли сборщик параметров конструктора в PHP?
Например:

class LinkTemplate {

private $name;
private $link;
private $full_link;
private $description;
private $image;

function __construct($data = array()){
    $this->name = $data['name'];
    $this->link = $data['link'];

}

}

Нужно, чтобы массив $data был распределен по переменным класса, а те, в свою очередь, были помещены в один массив. По сути, нужно избежать конструкции инициализаций:

$this->link = $data['link'];

Во-первых, хочется избежать проверок: if(isset($data['link'])) {$this->link = $data['link'];}

Ответы

▲ 1Принят

В общем, я не понял автора вопроса, но смею предположить, что он хочет что-то вроде вот такой вот конструкции :)

function __construct ($data = array()) {
    if (!empty($data) && is_array($data)) {
        foreach ($data as $key => $value) {
            $this->$key = $value;
        }
    }
}
▲ 1

Кто же ищет лёгких путей?

// долой наследование!
trait LazyConstructorTrait {

    protected function init($arguments)
    {
        $parameters = (new ReflectionObject($this))
            ->getConstructor()
            ->getParameters();

        foreach ($parameters as $key => $parameter) {
            $argument = isset($arguments[$key])
                      ? $arguments[$key]
                      : $parameter->getDefaultValue(); // обращаем-внимание-1

            $this->{$parameter->name} = $argument;
        }
    }
}

// пример
class A {
    use LazyConstructorTrait; // не теряем трейт

    protected $a;
    protected $b;
    protected $c;
    protected $d;

    public function __construct($a, $b, $d = 'someVal')
    {
        $this->init(func_get_args());
    }
}

$a = new A('a', 'b'); // $a->a == 'a', $a->b == 'b', $a->c == null, $a->d == 'someVal'
// или
$a = new A('a', 'b', 'd'); // $a->a == 'a', $a->b == 'b', $a->c == null, $a->d == 'd'

var_dump($a);

По поводу заметки обращаем-внимание-1: вызов метода ReflectionParameter::getDefaultValue() бросает исключение при обращении к обязательному параметру, но если вы пропустите такой параметр, то скрипт завалится еще в момент вызова. Поэтому, игнорируем.

Плюсы:

  • подключаем в любом классе и не беспокоим предков
  • работаем как обычно, с phpDoc и подсказками IDEшки

Минусы:

  • PHP >= 5.4
  • может еще что-то :)