Функция вызова в PHP 5? - PullRequest
122 голосов
/ 10 октября 2008

Есть ли функция PHP для определения имени функции вызывающей функции в данной функции?

Ответы [ 12 ]

178 голосов
/ 10 октября 2008

См. debug_backtrace - это может отследить ваш стек вызовов до самого верха.

Вот как вы получите своего абонента:

$trace = debug_backtrace();
$caller = $trace[1];

echo "Called by {$caller['function']}";
if (isset($caller['class']))
    echo " in {$caller['class']}";
15 голосов
/ 30 марта 2012

Xdebug предоставляет несколько приятных функций.

<?php
  Class MyClass
  {
    function __construct(){
        $this->callee();
    }
    function callee() {
        echo sprintf("callee() called @ %s: %s from %s::%s",
            xdebug_call_file(),
            xdebug_call_line(),
            xdebug_call_class(),
            xdebug_call_function()
        );
    }
  }
  $rollDebug = new MyClass();
?>

вернет след

callee() called @ /var/www/xd.php: 16 from MyClass::__construct

Для установки Xdebug на Ubuntu лучше всего подходит

sudo aptitude install php5-xdebug

Возможно, вам сначала потребуется установить php5-dev

sudo aptitude install php5-dev

подробнее

15 голосов
/ 10 октября 2008

debug_backtrace() предоставляет сведения о параметрах, вызовах функций / методов в текущем стеке вызовов.

14 голосов
/ 10 октября 2012

Это очень поздно, но я хотел бы поделиться функцией, которая даст имя функции, из которой вызывается текущая функция.

public function getCallingFunctionName($completeTrace=false)
    {
        $trace=debug_backtrace();
        if($completeTrace)
        {
            $str = '';
            foreach($trace as $caller)
            {
                $str .= " -- Called by {$caller['function']}";
                if (isset($caller['class']))
                    $str .= " From Class {$caller['class']}";
            }
        }
        else
        {
            $caller=$trace[2];
            $str = "Called by {$caller['function']}";
            if (isset($caller['class']))
                $str .= " From Class {$caller['class']}";
        }
        return $str;
    }

Надеюсь, это будет полезно.

8 голосов
/ 28 августа 2014
echo debug_backtrace()[1]['function'];

Работает с PHP 5.4 .

Или оптимизировано (например, для не отладочных сценариев использования):

echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];

Первый аргумент предотвращает заполнение неиспользуемых аргументов функции, второй ограничивает трассировку двумя уровнями (нам нужен второй).

7 голосов
/ 17 сентября 2012

Сделал это и использую это сам

/**
 * Gets the caller of the function where this function is called from
 * @param string what to return? (Leave empty to get all, or specify: "class", "function", "line", "class", etc.) - options see: http://php.net/manual/en/function.debug-backtrace.php
 */
function getCaller($what = NULL)
{
    $trace = debug_backtrace();
    $previousCall = $trace[2]; // 0 is this call, 1 is call in previous function, 2 is caller of that function

    if(isset($what))
    {
        return $previousCall[$what];
    }
    else
    {
        return $previousCall;
    }   
}
3 голосов
/ 04 марта 2015

Я просто хотел заявить, что путь flori не будет работать как функция, потому что он всегда будет возвращать имя вызываемой функции вместо вызывающего, но у меня нет репутации комментировать. Я сделал очень простую функцию, основанную на ответе Флори, которая отлично подходит для моего случая:

class basicFunctions{

    public function getCallerFunction(){
        return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['function'];
    }

}

Пример:

function a($authorisedFunctionsList = array("b")){
    $ref = new basicFunctions;
    $caller = $ref->getCallerFunction();

    if(in_array($caller,$authorisedFunctionsList)):
        echo "Welcome!";
        return true;
    else:
        echo "Unauthorised caller!";
        return false; 
    endif;
}

function b(){
    $executionContinues = $this->a();
    $executionContinues or exit;

    //Do something else..
}
2 голосов
/ 10 октября 2008

Вы можете извлечь эту информацию из массива, возвращенного debug_backtrace

1 голос
/ 26 февраля 2016

Это должно работать:

$caller = next(debug_backtrace())['function'];
1 голос
/ 06 июня 2013

На самом деле я думаю, что debug_print_backtrace () делает то, что вам нужно. http://php.net/manual/en/function.debug-print-backtrace.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...