Вот пример кода CFML, который я использую в качестве базовой линии (также на github @ getFunctionCalledName.cfm):
function f(){
echo("#getFunctionCalledName()#() called<br>");
}
f();
echo("<hr>");
g = f;
g();
Это выводит:
F () вызывается
G () называется
Обратите внимание, что getFunctionCalledName()
возвращает имя ссылки, используемой для вызова функции, а не просто имя функции.
Я пытаюсь увидеть, есть ли эквивалент в PHP. Вот мой тест на это (testFunction.php на GitHub):
Я знаю, что есть __FUNCTION__
магическая константа:
function f()
{
echo sprintf("Using __FUNCTION__: %s() called<br>", __FUNCTION__);
}
f();
echo "<hr>";
$g = "f"; // as someone points out below, this is perhaps not analogous to the g = f in the CFML code above. I dunno how to simply make a new reference to a function (other than via using function expressions instead, which is not the same situation
$g();
Однако это возвращает f
в обоих случаях.
Я написал похожий код, пытаясь debug_backtrace()
(увидеть testDebugBackTrace.php), но это также ссылается на функцию как f
,
Это хорошо, и я понимаю, почему они оба делают это. Однако мне интересно, есть ли PHP-эквивалент getFunctionCalledName()
, Спешу добавить, что это просто для ознакомительного упражнения: в настоящее время я перехожу с CFML на PHP, и это произошло, когда я что-то демонстрировал в своем блоге.
Ваш код $g = "f";
на самом деле не копирует функцию в другую переменную, а просто создает строковую ссылку на ту же функцию. Следующее будет более похоже на CFML, который вы предоставляете:
$x = function() {
echo __FUNCTION__;
};
$v = $x;
$v();
Приведенный выше код просто выводит {closure}
, поскольку PHP не назначает формальное имя анонимным функциям. Итак, ответ: нет, это невозможно в PHP.
Я не думаю, что то, что вам нужно, возможно в PHP без чего-то вроде расширения runkit. Это имеет функциональность для создания копии функции под новым именем. Я не пробовал это сам, так как не смог найти версию расширения для Windows.
http://php.net/manual/en/function.runkit-function-copy.php
<?php
function f() {
echo sprintf("Using __FUNCTION__: %s() called<br>", __FUNCTION__);
}
runkit_function_copy('f', 'g');
f();
g();
?>