【问题标题】:Function chaining with different return values?具有不同返回值的函数链接?
【发布时间】:2012-03-28 18:56:38
【问题描述】:

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

案例一:

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

案例 2:

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

有没有办法执行这样的行为?

【问题讨论】:

  • 为什么“$test->doSomething1()”返回4(案例1)和$this(案例2)?
  • 你真正想做的事情是不可能的,现在我想知道,你真的想要这个,还是你打错了问题?
  • @GabrielSantos 是的,我想要这个,它比存储值并在我的链式函数之后提取它要容易得多。
  • 我认为您的评论是正确答案之一。

标签: php function return-value chaining


【解决方案1】:

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

在“所有”语言之间共享的通用编程范式(方法、运算符等如何在语法的上下文中工作)要求表达式 $this->doSomething1() 的结果必须在可能调用 @987654323 的结果之前计算出来@就可以考虑了。静态类型和动态类型语言以不同的方式执行此操作,但共同的因素是表达式 $this->doSomething1() 必须独立于后面的或不后面的内容来考虑。

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

【讨论】:

  • +1。至于您对“所有”语言的评论:我认为 Python 可能愿意接受这种语法,但我不确定,因为我不经常使用它。会议室里有 Python 专家吗?
【解决方案2】:

不,根据是否对返回值调用另一个函数,函数不可能返回不同的值。您可以使用 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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不,它不能用于返回$this 或其他东西。该答案隐含地总是返回$this
    • @Jon,我正在考虑使用该答案中建议的调用堆栈数组来决定返回什么。现在回想起来,我意识到这是不可能的,因为该决定所需的信息只有在方法已经返回后才可用(当调用第二个链式方法时)。
    猜你喜欢
    • 2019-03-29
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多