我在PHP中遇到了很多关于方法链接的例子,但是找不到关于这个方法的任何内容,所以我向你们寻求帮助;)
我的问题是 - 我能以某种方式找出链中的方法是否是最后一个?在大多数情况下,人们使用某种最终方法(执行,发送,...)来判断链何时结束并返回相应的结果。但我想知道是否有一些隐藏的魔术方法或技术可以检查链中的所有方法并检测是否没有下一个方法? 没有final方法,它对字符串工作正常(在非常简单的例子中),但如果我想返回数组则不行。
这是我的代码:
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'
你知道,当我想打印链的结果时,我可以在__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]
内部)?
感谢
答案 0 :(得分:0)
方法链接使用函数的返回值,在这种情况下,这是对象的引用。通常不可能预测返回值的使用。
你必须告诉被调用的方法你想要做一些不同的事情。您可以使用第二个参数,例如如果定义了第二个参数,则返回不同的结果。另一个选项可能是修改类,使其行为类似于数组,除非它被打印。