2012-02-09 2 views
2

У меня есть класс admin_model с частным методом admin_form()получить имя функции, которая называется функция без аргументов

Есть целый ряд других общественных функций, которые вызывают этот метод.

Есть ли способ получить название функции, которая называется admin_form() от INSIDE admin_form()?

Я мог бы легко добавить аргумент при вызове admin_form() как:

$this -> admin_form(__FUNCTION__); 

затем внутри admin_form($caller) меня вызывающему. Это будет $caller

Но я надеялся, что существует способ сделать это БЕЗ прохождения аргументов.

Любые идеи ??

Cheers, Alex

+0

означает, что вы хотите рекурсивную функцию? – diEcho

+0

Возможный дубликат [Как получить имя вызывающей функции/метода в PHP?] (Http://stackoverflow.com/questions/2110732/how-to-get-name-of-calling-function-method-in-php) –

+0

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

ответ

0

Независимо от того,

Для моего требования эта функция полезна, а что "плохо кодирование.

Во всяком случае, ответ:

$e = new Exception(); 
$trace = $e -> getTrace(); 
$caller = $trace[1]["function"]; 

Это позволит получить имя функции вызывающего абонента.

1

Вы можете сделать это с debug_backtrace():

<?php 
class admin_model { 
    public function foo() { 
     $this->admin_form(); 
    } 

    public function bar() { 
     $this->admin_form(); 
    } 

    private function admin_form() { 
     // Get the current call stack 
     $stack = debug_backtrace(); 

     // Remove this call (admin_form()) from the stack 
     array_shift($stack); 

     // The calling method is now on the top of the stack 
     $lastCall = array_shift($stack); 
     $callingMethod = $lastCall['function']; 

     echo "admin_form() called by method: $callingMethod\n"; 
    } 
} 

$model = new admin_model(); 
$model->foo(); 
$model->bar(); 

Выход:

admin_form() called by method: foo 
admin_form() called by method: bar 

Но, как уже отмечалось, это плохая практика, и вы должны пересмотреть свой дизайн.

Смежные вопросы