2017-03-05 90 views
1

说我有下面的类:如何在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方法链工作?

+1

你必须选择:要么你返回的对象,以便您可以链接,或返回一个值。你不能两个都做。 – jeroen

回答

1

如果您想要链接方法,您需要从任何方法中返回当前实例,该方法之后有另一个链接的调用。但是,链中的最后一次呼叫没有必要这样做。在这种情况下,这意味着你可以自由地返回你喜欢的任何东西test2()

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

0

return $this里面test1()test2()方法。

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(); 
1

您可以通过其引用传递$数据,你可以改变它或将任何数据分配给它。

// 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

相关问题