具有不同返回值的函数链接?

时间:2012-03-28 18:56:38

标签: php function return-value chaining

是否可以让方法根据上下文返回不同的值(如何使用返回值)?例如,当一个方法与箭头运算符一起使用以调用另一个方法(即链接方法调用)时,它是否可以返回$this,但是如果不以这种方式使用返回值,则返回一个标量?

案例1:

$result = $test->doSomething1(); // returns 4
// $result returns 4

案例2:

$result = $test->doSomething1()->doSomething2();
// doSomething1() returns $this
// doSomething2() returns 8

无论如何都要执行这样的行为吗?

3 个答案:

答案 0 :(得分:4)

如果我正确理解了这个问题,你需要一个方法(doSomething1)来根据调用链的其余部分返回一个值。不幸的是,你绝对没办法做到这一点。

跨“所有”语言共享的通用编程范例(语法上下文中的方法,运算符和此类工作如何)规定表达式$this->doSomething1()的结果必须在可能调用的结果之前解决可以考虑->doSomething2()。静态类型和动态类型语言以不同方式执行此操作,但常见因素是表达式$this->doSomething1()必须独立于后续或不遵循的内容进行考虑。

简而言之:$this->doSomething1()必须在两种情况下都返回特定类型的值。在PHP中,没有办法让一种类型的值在一个上下文中表现得像一个数字,就像一个具有在另一个上下文中调用方法的对象。

答案 1 :(得分:3)

不可能让函数返回不同的值,具体取决于是否在返回值上调用了另一个函数。您可以使用toString()(其中转换为字符串适用,或者您在每个链的末尾调用的另一个函数来获取值而不是对象)来模拟它:

$test = new foo();
echo $test->doSomething1(); // Outputs 1

$test = new foo();
echo $test->doSomething1()->doSomething2(); // Outputs 3

$test = new foo();
$result = $test->doSomething1()->done(); // $result === 1

$test = new foo();
$result = $test->doSomething1()->doSomething2()->done(); // $result === 3

class foo {

    private $val;

    function __construct($val = 0){
        $this->val = $val;
    }

    function doSomething1(){
        $this->val += 1;
        return $this;
    }

    function doSomething2(){
        $this->val += 2;
        return $this;
    }

    function done(){
        return $this->val;
    }

    function __toString(){
        return (string)$this->val;
    }

}

Codepad Example

答案 2 :(得分:0)

This answer建议在类上创建一个内部调用堆栈,这样您就可以跟踪您在方法链中的位置。这可以用于返回$this或其他内容,具体取决于上下文。