2014-09-17 2 views
3

Вот пример кода CFML я использую в качестве основы (также на GitHub @getFunctionCalledName.cfm):Получить имя функции Назвался, что эквивалентно getFunctionCalledName CFML в()

function f(){ 
    echo("#getFunctionCalledName()#() called<br>"); 
} 

f(); 
echo("<hr>"); 

g = f; 
g(); 

Это выходы:

Р() называется

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

+0

Я не уверен, если этот параметр не существует. Поскольку функции в PHP имеют фиксированное имя, это, скорее всего, то, что возвратит каждая функция или константа. – Erik

+0

Нет сомнений в том, что это требует пониженного голосования, но было бы немного полезно, если бы вы объяснили * почему *. Я с удовольствием польский вопрос, если он в ней нуждается. –

ответ

1

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

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

$v = $x; 
$v(); 

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

+0

Да, я изо всех сил пытался выяснить, как назначить функцию переменной в PHP (аналогично «g = f'; в коде CMFL выше). Это было мое самое близкое предположение: я очень новичок в PHP. Вышеупомянутая версия функции-выражения не является аналогичной. Приветствия за советы! –

0

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