Оставив длинную историю, у меня есть такой сценарий:
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. Это образец стороннего кода, который я вызываю и который учитывает имя функции, вызвавшей его, чтобы что-то сделать.
Вы можете передать имя 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;
}
Единственное, о чем я могу думать, не меняя ничего в doSomething (), это использовать eval()
function __call($method, $args)
{
eval("function {$method}(\$self) {
\$self->doSomething();
}
{$method}(\$this);
");
}