【问题标题】:Method chaining without final method没有最终方法的方法链接
【发布时间】:2012-01-10 10:55:36
【问题描述】:

我在 PHP 中遇到了很多方法链的例子,但是找不到任何关于这个的,所以我请求你们帮助;)

我的问题是 - 我可以通过某种方式找出链中的方法是否是最后一个方法吗?在大多数情况下,人们使用某种最终方法(执行、发送、..)来判断链何时结束并返回相应的结果。但是我想知道是否有一些隐藏的魔法方法或技术可以检查链中的所有方法并检测是否没有下一个方法? 如果没有 final 方法,它适用于字符串(在非常简单的示例中),但如果我想返回数组则不行。

这是我的 sn-p:

class Chain {
    private $strArray;

    function __call($name, $args) {
        $this->strArray[] = $args[0];
        return $this;
    }
    function __toString() {
        return implode('-', $this->strArray);
    }
}
// example 1
$c = new Chain();
$x = $c->foo('hi')->bar('stack'); // need array('hi', 'stack')

// example 2
$c = new Chain();
$x = $c->foo('hi')->bar('stack')->foobar('overflow'); // need array('hi', 'stack', 'overflow')

// example 3
$c = new Chain();
echo $c->foo('hi')->foobar('overflow'); // prints 'hi-overflow'

// example 4
$c = new Chain();
echo $c->foo('hi')->bar('stack')->foobar('overflow'); // prints 'hi-stack-overflow'

你看,当我想打印chain的结果时,我可以在__toString方法中修改结果,但是如果我需要一个数组(例子1、2)呢?有没有办法在不调用一些额外的“最终”方法的情况下实现这一点?

非常感谢您的帮助,如果您需要更多信息,请告诉我。

编辑:在得到@bandi 的反馈后,我尝试像这样扩展ArrayObject

class Chain extends ArrayObject {
    function __call($name, $args) {
        $this->append($args[0]);
        return $this;
    }
    function __toString() {
        return implode('-', $this->getIterator()->getArrayCopy());
    }
}
// returned ref. to object, works fine in loop or accessing offset
$obj = new Chain;
$x = $obj->foo('hi')->bar('stack')->foobar('overflow'); // need array('hi', 'stack', 'overflow')
foreach ($x as $y) {
    echo $y, "\n";
}
var_dump($x[0], $x[1], $x[2]);

// returned String
$c = new Chain;
echo $c->foo('hi')->foobar('overflow'); // prints 'hi-overflow'

它符合我的要求,但我对$this->getIterator()->getArrayCopy() 部分感觉不太好。是否有一些简单的方法来访问数组(在["storage":"ArrayObject":private] 内部)? 谢谢

【问题讨论】:

    标签: php oop


    【解决方案1】:

    方法链接使用函数的返回值,在这种情况下,这是对对象的引用。预测返回值的使用通常是不可能的。

    你必须告诉被调用的方法你想做一些不同的事情。您可以为此使用第二个参数,例如如果定义了第二个参数,则返回不同的结果。另一种选择可能是修改类,使其表现得像一个数组,除非它被打印出来。

    【讨论】:

    • 好的,谢谢。通常我想在分配给变量时返回数组,但仍然可以选择转换为字符串。当我返回 $this 时,我没有得到类属性 ($strArray),而是对类的整个引用,这是不希望的,它迫使我实现“最终”方法。但也许真正最简单的是将第二个参数 TRUE 传递给链中的最后一个方法,正如你所建议的。我会看看是否会有更多的建议;)
    • 顺便说一句。你是什​​么意思 - “另一个选择可能是修改类,使其表现得像一个数组,除非它被打印出来。”??我不确定我是否理解
    • @lp1051 我对较新版本中的 php 类系统并不完全熟悉,所以我不知道这是否可能:我的意思是你从'array'类派生你的类并且然后添加您的两个自定义方法。
    猜你喜欢
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多