Как вернуть значения функции при использовании метода цепочки в PHP?

Скажем, у меня есть следующий класс:

class Test
{

    private static $instance = false;

    public static function test()
    {
        if(!self::$instance)
        {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function test1()
    {
        //...
    }

    public function test2()
    {
        //...
    }

}

И я продолжаю вызывать функции, связывая их так:

$data = Test::test(...)->test1(...)->test2(...);

На данный момент для работы вышеуказанной цепочки методов я должен продолжать возвращаться $instance и мне бы очень хотелось, чтобы я мог вернуть что-то из test2(), чтобы потом быть назначенным $data но я не уверен, как это сделать, потому что я должен продолжать возвращаться $instance для того, чтобы цепочка метода mt работала?

4 ответа

Решение

Если вы хотите объединить методы в цепочку, вам нужно вернуть текущий экземпляр из любого метода, к которому после него подключен другой вызов. Однако это не обязательно для последнего вызова в цепочке. В этом случае это означает, что вы можете вернуть все, что хотите от test2()

Просто имейте в виду, если вы вернете что-то отличное от test2() Вы никогда не сможете связать что-либо с этим в будущем. Например, $data = Test::test(...)->test2(...)->test1(...); не сработает.
Подсказка: стоит документировать ваш код с некоторыми комментариями, поясняющими, какие из них являются цепочечными, а какие нет, чтобы не забыть в будущем

Вы можете передать $data по его ссылке, и вы можете изменить его или присвоить ему любые данные.

// inside class

public function test2( &$data ) {
   $data = 'it will work';
}

// outside class
 $data = '';
 Test::test(...)->test1(...)->test2($data);

проверьте это http://php.net/manual/en/language.references.pass.php

Вообще говоря, если вы выполняете цепочку методов, и я предполагаю, что каждый из приведенных выше тестов возвращает вашу модель данных в другое состояние, и я предполагаю, что вам нужны некоторые данные из самой модели. Я бы сделал следующее:

class Test
{
    private static $model;

    public function test1() {
        //do something to model
        return $this;
    }

    public function test1() {
        //do something to model
        return $this;
    }

    public function finish_process() {
        //process results
        return $this.model;
    }
}

так что по сути я могу сделать следующее сейчас:

$results = Test::test1()->finish_process();

а также

$results = Test::test1()->test2()->finish_process();

return $this внутри test1() а также test2() методы.

Другие вопросы по тегам