Подделка имени функции замыкания

Оставив длинную историю, у меня есть такой сценарий:

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. Это образец стороннего кода, который я вызываю и который учитывает имя функции, вызвавшей его, чтобы что-то сделать.

9

Решение

Вы можете передать имя doSomething() лайк

$this->doSomething($method);

или с закрытием как

$c = function($func_name) { $this->doSomething($func_name); };
$c($method);

И в doSomething Вы можете использовать этот параметр.

function doSomething($method) {
print "I was just called from " . $method;
}
1

Другие решения

Единственное, о чем я могу думать, не меняя ничего в doSomething (), это использовать eval()

function __call($method, $args)
{
eval("function {$method}(\$self) {
\$self->doSomething();
}

{$method}(\$this);
");
}
0