【发布时间】:2015-02-13 04:46:09
【问题描述】:
不说长话,我有一个这样的场景:
class Foo {
function doSomething() {
print "I was just called from " . debug_backtrace()[1]['function'];
}
function triggerDoSomething()
{
// This outputs "I was just called from triggerDoSomething".
// This output makes me happy.
$this->doSomething();
}
function __call($method, $args)
{
// This way outputs "I was just called from __call"
// I need it to be "I was just called from " . $method
$this->doSomething();
// This way outputs "I was just called from {closure}"
// Also not what I need.
$c = function() { $this->doSomething() };
$c();
// This causes an infinite loop
$this->$method = function() { $this->doSomething() };
$this->$method();
}
}
在我调用 $foo->randomFunction() 的情况下,我需要输出读取“我刚刚从 randomFunction 调用”
有没有办法给闭包命名或以不同的方式解决这个问题?
注意:我无法更改 doSomething 函数。这是我正在调用的第三方代码示例,它考虑了调用它的人的函数名称以便做某事。
【问题讨论】:
-
@Anthony,如果您可以使用
eval(),您可以查看我更新后的答案。 -
为什么回溯如此重要?您正在处理的实际问题是什么?
-
我觉得需要很长时间才能解释清楚,因为有很多层特殊情况。但简而言之,我使用的是 Laravel Eloquent ORM(与 Neo4j 和 NeoEloquent 混合),我试图通过父类中的 __call() 动态声明关系方法,但 Laravel 使用方法名称本身作为其逻辑的一部分.这不是我能改变的。因此,我将整个场景简化为上面的核心问题。