【发布时间】: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] 内部)?
谢谢
【问题讨论】: