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?
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?
Câu trả lời:
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']}";
list(, $caller) = debug_backtrace(false);
để có được người gọi, false
cho hiệu suất ;-) (php5.3)
echo 'called by '.$trace[0]['function']
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.
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
Đ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.
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.
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).
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;
}
}
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'];
}
}
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..
}
Bạn có thể trích xuất thông tin này từ mảng được trả về bởi debug_backtrace
Điều này làm việc tốt nhất cho tôi: var_dump(debug_backtrace());
Thật ra tôi nghĩ debug_print_backtrace () làm những gì bạn cần. http://php.net/manual/en/feft.debug-print-backtrace.php
Đ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()
**/```