你们知道我怎样才能确定哪个文件是该函数内部调用的函数?
我正在考虑使用debug_backtrace ..但这看起来并不是一种优雅的方式,而且还会在另一个问题中引发其他原因here
那么还有其他替代方案吗?
非常感谢
答案 0 :(得分:3)
我之前从某个地方借过这段代码,它就像使用debug_backtrace()的魅力一样。希望你觉得它很有用:
function backtrace(){
$backtrace = debug_backtrace();
$output = '';
foreach ($backtrace as $bt) {
$args = '';
foreach ($bt['args'] as $a) {
if (!empty($args)) {
$args .= ', ';
}
switch (gettype($a)) {
case 'integer':
case 'double':
$args .= $a;
break;
case 'string':
//$a = htmlspecialchars(substr(, 0, 64)).((strlen($a) > 64) ? '...' : '');
$args .= "\"$a\"";
break;
case 'array':
$args .= 'Array('.count($a).')';
break;
case 'object':
$args .= 'Object('.get_class($a).')';
break;
case 'resource':
$args .= 'Resource('.strstr($a, '#').')';
break;
case 'boolean':
$args .= $a ? 'TRUE' : 'FALSE';
break;
case 'NULL':
$args .= 'Null';
break;
default:
$args .= 'Unknown';
}
}
$output .= '<br />';
$output .= '<b>file:</b> '.@$bt['file'].' - line '.@$bt['line'].'<br />';
$output .= '<b>call:</b> '.@$bt['class'].@$bt['type'].@$bt['function'].'('.$args.')<br />';
}
return $output;
}
答案 1 :(得分:3)
米老鼠工作人员的回复是在线PHP社区的典型代表!他们没有分享答案,而是问你为什么需要它。没关系solomongaby问一个有效的问题,这是一个非常正常的功能,有标准的IDE和更专业的语言,如Java和Objective-C。
Solomongaby,这是满足您需求的最简单方式:
$bt = debug_backtrace();
$end = end($bt);
var_dump($end['class']); //or var_dump($end['file']);
答案 2 :(得分:2)
在函数debug_backtrace()
内是确定调用者的唯一方法,除非您将该信息作为参数传递。
注意,您不能使用默认值来执行此操作。 E.g:
function f($param1, $param2, $caller=__FUNCTION__) ...
__FUNCTION__
将在分析时进行评估,因此它将始终具有相同的值。声明范围f
的函数。
答案 3 :(得分:1)
那里你没有多少选择。另一个选项(在另一个问题中发布)强制调用者使用函数调用来提供它的信息(使用PHP魔术常量):
callFunction(1, 2, 3, __FUNCTION__)
callFunction(1, 2, 3, __CLASS__, __METHOD__)
callFunction(1, 2, 3, $this, __METHOD__)
or
$class = new ReflectionClass( __CLASS__ );
$method = $class->getMethod( __METHOD__ );
callFunction(1, 2, 3, $method) // $method would be a ReflectionMethod obj
将是一种可能的选择。但它是
callFunction
的代码失败,并且很难跟踪这些错误。如果我在你的位置,我会尝试在整个代码中使用的函数中避免它。使用debug_backtrace
(即使它可能'慢')。可读代码胜过快速代码。
答案 4 :(得分:0)
如果这是出于调试目的,您可以抛出异常,并在捕获它的位置打印函数调用堆栈。