例如,假设我有一组类和方法:
$obj->method1()->method2();
无论如何,method1()是否知道它自己被调用的第一个方法或者方法2知道它的最后一个?
更多细节
我只是希望能够构建一组这样的调用,以便如果对方法的调用不在链的末尾,则返回自身的实例,或者如果它在结尾处返回不同的东西。
例如
$obj->method1()->method2(); #Here method 2 will return lets say a string.
$obj->method1()->method2()->method3(); #Since method2 isnt at the end of the chain, it should return an instance of itself (or another object) here so that the chain could continue.
这似乎是重复的。有关更多答案,请参阅this question。
答案 0 :(得分:1)
没有开箱即用,甚至没有堆栈跟踪。
我猜你可以使用常量或全局变量将某些东西放在一起:
请勿在家中尝试此操作!
$GLOBALS["chain"] = array();
$obj->method1()->method2(); // method1 adds member to $GLOBALS["chain"],
// array_push($GLOBALS["chain"], __FUNCTION__);
// method2 does the same...
print_r($GLOBALS["chain"]);
那会给你一个完整的链 - 不是哪一个是最后一个,要做到这一点,你必须将标志传递给method2()
。
但它会非常hacky并污染你的代码。
您需要这个特定原因吗?
答案 1 :(得分:0)
我不认为这是可能的,不 - 至少,我从来没有见过这个。
(出于好奇:为什么你需要那个?也许有可能使用其他解决方案来解决你的实际问题?)
答案 2 :(得分:0)
唯一可行的方法是让方法保存一些全局状态。
如果两个方法都在同一个类中,您可以向该类添加一个变量,并让每个类设置一个唯一值。
但问题是这是否可取。从长远来看,这种行为往往不是很聪明。
答案 3 :(得分:0)
通过在类中设置某种全局状态,您所能做的就是找出目前已被称为 的方法。但是你无法找出方法后调用的方法,你无法区分一个链中的方法和另一个链中的方法之间的区别:
$obj->m1()->m2();
$obj->m3(); // You would think that m1() and m2() came before this in the same chain
您需要在每个链的末尾都有一个方法来清除类中的全局状态。
由于您似乎需要查看链中的 next 哪个方法,这对您不起作用。
我会说这是一个非常糟糕的设计模式,至少对于PHP(以及我曾经使用过的所有其他语言)。每种方法都应该只做一件事。如果你需要一个方法来返回一个字符串或一个对象,这取决于你以后需要什么,你做错了。
当然,我之前做过类似的事情。它是用户提交的图像的元信息类 - 您可以这样设置:
$meta = new ImageMeta();
$meta->first_name("foo")->last_name("bar")->email("baz")->id("guid");
但是,如果你这样做了:
$meta->first_name();
它将返回一个字符串。第一个参数的默认值为NULL,如果方法为NULL,则返回一个字符串。否则,它设置(并转义)内部值并返回$this
。
起初我觉得这很酷,但事实证明这是一个错误。我现在讨厌使用那门课。只需让一个方法/功能只做 一个 的东西,你就会更开心。