PHP ООП: цепочка методов

У меня есть следующий код,

<?php
class Templater
{
    static $params = array();

    public static function assign($name, $value)
    {
        self::$params[] = array($name => $value);
    }

    public static function draw()
    {
        self::$params;
    }
}


 $test = Templater::assign('key', 'value');
 $test = Templater::draw();
 print_r($test);

Как я могу изменить этот сценарий, чтобы я мог использовать это?

$test = Templater::assign('key', 'value')->assign('key2', 'value2')->draw();
print_r($test);

person Isis    schedule 07.06.2010    source источник
comment
Вы также можете изменить метод assign(), чтобы он мог принимать массив значений key =›.   -  person allnightgrocery    schedule 07.06.2010
comment
Вы должны быть более точными в том, что вы действительно хотите сделать. Соответствует ли простой ассоциативный массив вашей цели?   -  person mathk    schedule 07.06.2010


Ответы (5)


Вы не можете использовать связывание методов со статическими методами, потому что вы не можете вернуть область уровня класса (return self выиграла' т делать). Измените свои методы на обычные методы и return $this в каждом методе, из которого вы хотите разрешить цепочку.

Обратите внимание, что вы не должны использовать T_PAAMAYIM_NEKUDOTAYIM для доступа к методам экземпляра, так как это вызовет уведомление E_STRICT. Используйте T_OBJECT_OPERATOR для вызова методов экземпляра.

Также см:

person Gordon    schedule 07.06.2010

Вы не должны использовать статические члены:

class Templater
{
    private array $params = [];

    public function assign($name, $value) : self
    {
        $this->params[$name] = $value;

        return $this;
    }

    public function draw()
    {
        // do something with $this->params
    }
}

$test = (new Templater())->assign('key', 'value')->assign('key2', 'value2')->draw();
person Artefacto    schedule 07.06.2010
comment
вы не можете отключить такой конструктор! - person Galen; 15.03.2013

Просто используйте переменные экземпляра и функции экземпляра вместо статических.

<?php
class Templater
{
    $params = array();

    public function assign($name, $value)
    {
        $this->params[] = array($name => $value); 
        return $this;
    }

    public function draw()
    {
        echo $this->params;
        return $this;
    }
}

$test = new Templater();
$test->assign('key', 'value')->assign('key2', 'value2')->draw();
print_r($test);
person vartec    schedule 07.06.2010
comment
Вам нужно добавить return $this; в конце метода assign(), иначе цепочка не будет работать. - person Rich Adams; 07.06.2010

////////

class Templater { static $params = array();

public static function assign($name, $value)
{
    self::$params[] = array($name => $value);
    return new Templater;
}

public static function draw()
{
    return self::$params;
}

}

$test = Templater::assign('key', 'value')->assign('key2', 'value2')->draw(); print_r ($ тест);

person Akram Younes    schedule 25.09.2014
comment
В этом ответе отсутствует образовательное объяснение и правильное форматирование. - person mickmackusa; 29.11.2020

Смешивание статического вызова и вызова экземпляра, как это, в целом является плохой формой, опуская этот вызов (если вы не укажете причину, по которой он должен быть статическим). Другая концепция, с которой вы работаете, — это цепочка вызовов, которая реализуется с помощью возвратов.

class Templater
{
    protected $params = array();

    public function assign($name, $value) {
        $this->params[] = array($name => $value);
        return $this;
    }

    public function draw() {
        // do drawing w/ $this->params;
        return $this;
    }
}
person Joseph Mastey    schedule 07.06.2010