Получить имя, под которым была вызвана функция, эквивалентно getFunctionCalledName () CFML

Вот пример кода 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, и это произошло, когда я что-то демонстрировал в своем блоге.

3

Решение

Ваш код $g = "f"; на самом деле не копирует функцию в другую переменную, а просто создает строковую ссылку на ту же функцию. Следующее будет более похоже на CFML, который вы предоставляете:

$x = function() {
echo __FUNCTION__;
};

$v = $x;
$v();

Приведенный выше код просто выводит {closure}, поскольку PHP не назначает формальное имя анонимным функциям. Итак, ответ: нет, это невозможно в PHP.

1

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

Я не думаю, что то, что вам нужно, возможно в 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();
?>
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector