Lấy tên của hàm gọi trong PHP?


135

Có một hàm PHP để tìm ra tên của hàm người gọi trong một hàm đã cho không?


Bạn nên sử dụng Xdebug. Xem câu trả lời của tôi trong bài đăng này: stackoverflow.com/questions/1513069/ từ
svassr

13
Xdebug về mặt phân loại không chỉ là một hàm PHP, mà là yêu cầu ban đầu. Nếu bạn muốn sử dụng tên hàm của người gọi trong logic PHP sau này và không cài đặt XDebug trên các máy chủ sản xuất, bạn cần một hàm PHP.
JP

Câu trả lời:


198

Xem debug_backtrace - điều này có thể theo dõi ngăn xếp cuộc gọi của bạn từ đầu đến đỉnh.

Đây là cách bạn nhận được người gọi của bạn:

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

echo "Called by {$caller['function']}";
if (isset($caller['class']))
    echo " in {$caller['class']}";

59
Dường như với tôi rằng điều này in tên hàm callee. Sử dụng list(, $caller) = debug_backtrace(false);để có được người gọi, falsecho hiệu suất ;-) (php5.3)
Znarkus

Nhiều giải pháp được thấy trên web có được phần tử thứ hai của mảng backtrace để lấy trình gọi cá thể: chúng ta có thể chắc chắn về nó không? Là yếu tố thứ hai luôn luôn là yếu tố chúng ta đang tìm kiếm? Tôi nghĩ rằng một __construct () bao gồm bên trong một cuộc gọi khác, chẳng hạn như cha mẹ :: __ construc () có thể thay đổi vị trí khác mà người gọi thực sự (chưa thử).
Emanuele Del Grande

1
Tôi đã thử kiểm tra thứ tự của những người gọi được trả về trong khi sử dụng ReflectionClass và rõ ràng nó thay đổi vị trí của phương thức người gọi "thực", có thể nhìn thấy trong giao diện người dùng, do đó không thể đưa ra giả định về vị trí backtrace.
Emanuele Del Grande

4
dịch chuyển mảng sẽ loại bỏ phần tử đầu tiên và trả về phần tử bị loại bỏ. Mảng ban đầu sẽ được sửa đổi và điều này sẽ cho kết quả bắt buộcecho 'called by '.$trace[0]['function']
GoodSp33d

21
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];để có được tên người gọi với hiệu suất tốt hơn.
ahuigo

17

Xdebug cung cấp một số chức năng tốt đẹp.

<?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();
?>

sẽ trở lại dấu vết

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

Để cài đặt Xdebug trên Ubuntu, cách tốt nhất là

sudo aptitude install php5-xdebug

Bạn có thể cần phải cài đặt php5-dev trước

sudo aptitude install php5-dev

thêm thông tin


15

Điều này là rất muộn nhưng tôi muốn chia sẻ chức năng sẽ cho biết tên của chức năng mà từ đó chức năng hiện tại được gọi.

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;
    }

Tôi hy vọng điều này sẽ hữu ích.


1
Bạn được chào đón nhất David !!! Tôi cũng đang sử dụng điều này cho mục đích gỡ lỗi trong dự án của mình :)
MANISH ZOPE

Chế độ "theo dõi hoàn chỉnh" rất hữu ích. Cám ơn vì đã chia sẻ.
Leopoldo Sanczyk

15

debug_backtrace() cung cấp chi tiết các tham số, các lệnh gọi hàm / phương thức trong ngăn xếp cuộc gọi hiện tại.


9
echo debug_backtrace()[1]['function'];

Hoạt động kể từ PHP 5.4 .

Hoặc được tối ưu hóa (ví dụ: đối với các trường hợp sử dụng không gỡ lỗi):

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

Đối số thứ nhất ngăn chặn việc đưa vào các đối số hàm không sử dụng, đối số thứ hai giới hạn dấu vết ở hai cấp độ (chúng ta cần thứ hai).


7

Làm cái này và dùng cái này

/**
 * 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

Tôi chỉ muốn nói rằng cách của flori sẽ không hoạt động như một hàm vì nó sẽ luôn trả về tên hàm được gọi thay vì người gọi, nhưng tôi không có tiếng để bình luận. Tôi đã thực hiện một chức năng rất đơn giản dựa trên câu trả lời của flori hoạt động tốt cho trường hợp của tôi:

class basicFunctions{

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

}

THÍ DỤ:

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..
}




1

Điều này sẽ làm việc:

$caller = next(debug_backtrace())['function'];

0

Điều này sẽ làm điều đó độc đáo:


// Outputs an easy to read call trace
// Credit: https://www.php.net/manual/en/function.debug-backtrace.php#112238
// Gist: https://gist.github.com/UVLabs/692e542d3b53e079d36bc53b4ea20a4b

Class MyClass{

public function generateCallTrace()
{
    $e = new Exception();
    $trace = explode("\n", $e->getTraceAsString());
    // reverse array to make steps line up chronologically
    $trace = array_reverse($trace);
    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method
    $length = count($trace);
    $result = array();
   
    for ($i = 0; $i < $length; $i++)
    {
        $result[] = ($i + 1)  . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
    }
   
    return "\t" . implode("\n\t", $result);
}

}

// call function where needed to output call trace

/**
Example output:
1) /var/www/test/test.php(15): SomeClass->__construct()
2) /var/www/test/SomeClass.class.php(36): SomeClass->callSomething()
**/```
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.