Создание произвольной иерархии объектов с минимальными усилиями? - PullRequest
1 голос
/ 08 января 2012
Класс

My Chart фактически позволяет мне создавать простые свойства (типа string, boolean и т. Д.), А также вложенные свойства object, вызывающие магический метод __call следующим образом:

$chart = new Chart();
$chart->simple = 'Hello';
$chart->newComplex();

var_dump($chart);

Вывод:

object(Chart)[1]
  public 'simple' => string 'Hello' (length=5)
  public 'complex' => 
    object(stdClass)[2]

Я бы хотел добавить возможность создавать также вложенные object свойства как дочерние элементы других свойств (не дочерние элементы самой диаграммы).) таким образом:

$chart->newComplex2($chart->newComplex1());

Вопрос : как использовать параметр $args и изменить __call() для достижения этой цели?

class Chart
{

    public function __call($name, $args)
    {

        $type  = substr($name, 0, 3);
        $field = lcfirst(substr($name, strlen($type)));

        switch($type)
        {
            case 'get': return isset($this->$field) ? $this->$field : null;
            case 'new': return $this->$field = new stdClass();
        }

    }

}

1 Ответ

0 голосов
/ 08 января 2012

Я нашел решение сам.Хитрость заключается в том, чтобы передать родительское свойство __call.Вот код:

public function __call($name, $args)
{

    $type  = substr($name, 0, 3);
    $field = lcfirst(substr($name, strlen($type)));

    switch($type)
    {
        case 'get':
            return isset($this->$field) ? $this->$field : null;
        case 'new':
            return (isset($args[0]) ? $args[0]->$field = new stdClass()
                : $this->$field = new stdClass());
        default: return $this->$name();
    }

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