我已阅读this previous question。我的问题很相似:要调试某些问题,我需要将对源文件includes/foo.php
中的函数的所有调用记录到数据库:
<?php
function f1($arg1, $arg2) {
return $arg1 . "x" . $arg2;
}
...
function f9($foo, $bar=array(), $baz=0) {
return array(...);
}
最简单的方法是什么?我曾考虑过将includes/foo.php
移至includes/foo.php_orig
,重命名该源中的所有函数(例如f1至f1__orig,依此类推),然后放入我自己的包装器includes/foo.php
:
<?php
include "includes/logger.php";
include "includes/foo.php_orig";
function f1($arg1, $arg2) {
$res = f1__orig($arg1, $arg2);
log_fcall(array($arg1, $arg2), $res);
return $res;
}
...
function f9($foo, $bar=array(), $baz=0) {
$res = f9__orig($foo, $bar, $baz);
log_fcall(array($foo, $bar, $baz), $res);
return $res;
}
但这感觉很繁琐和手动。 PHP是否提供另一种机制?或至少是其他一些缓解痛苦的方法。
答案 0 :(得分:0)
您可以执行此操作的一种方法是使用一些包装魔术和评估程序。这并不是说您应该这样做,因为如果这是用于调试,则有更好的工具,例如debug_baktrace
由04FS在评论中提及。此外,根据托管PHP代码的位置,eval
可能会被禁用。
包装器将使用预期的函数名称和一个匿名函数,如下所示:
$wrapped = array();
function logWrap($name, $func) {
global $wrapped;
$wrappedIndex = count($wrapped);
$wrapped[] = $func;
eval(
"function ${name}() {"
. "global \$wrapped;"
. "\$args = func_get_args();"
. "\$res = call_user_func_array(\$wrapped[${wrappedIndex}], \$args);"
. "log_fcall(\$args, \$res);"
. "return \$res;"
. "}");
}
然后,您可以像这样简单地包装函数:
logWrap("f1", function($arg1, $arg2) {
return $arg1 . "x" . $arg2;
});