1

假设我有以下课程:

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

4 回答 4

1

如果要链接方法,则需要从任何方法返回当前实例,该方法后面有另一个调用链接。但是,链中的最后一个调用没有必要这样做。在这种情况下,这意味着您可以自由退货test2()

请记住,如果您返回与您不同的test2()东西,将来您将永远无法将任何东西链接到它上面。例如,$data = Test::test(...)->test2(...)->test1(...);不会工作。
Protip:值得用一些注释来记录你的代码,解释哪些是可链接的,哪些是不可链接的,这样你以后就不会忘记。

于 2017-03-05T21:22:57.483 回答
1

一般来说,如果您正在执行方法链接,并且我假设上面的每个测试都以不同的状态返回您的数据模型,并且我假设您需要来自模型本身的一些数据。我会做以下事情:

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();
于 2017-03-05T21:24:09.750 回答
1

您可以通过其引用传递 $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

于 2017-03-05T21:25:15.783 回答
0

return $this内部test1()test2()方法。

于 2017-03-05T21:18:59.840 回答