我可以创建一个PHP“宏”(如#define)来为函数调用提供参数吗?

2022-08-30 23:18:56

我正在谈论的参数是函数调用方的参数和 - 那些参数,以便函数可以在错误报告中使用它们。__FILE____LINE__

假设我有两个文件和file_1.php调用的第 100 行file_2.phpmy_func()

我想进行该调用,以便在遇到错误时,它可以在第100行针对file_1.php报告它。my_func(__FILE__, __LINE__)my_func

我这样做是因为有数百个调用并报告错误my_func()本身可能没有信息(除非我转储堆栈)。我不想手动键入这两个参数几百次。my_func

在C中,我会做类似的事情 - 我可以在PHP中做类似的事情吗?#define MY_FUNC my_func(__FILE, __LINE)


答案 1

不幸的是,PHP没有任何种类的宏。您可以通过运行命令行工具(例如通过一些输入来插入宏)自己实现这些,但这容易出错并且有点草率。sed

若要执行所需的操作,可以考虑debug_backtrace函数。


答案 2

您可以在源文件重写的帮助下复制类似 C 的宏。

写文件 :macro.php

<?php

$name = $_SERVER['PHP_SELF'];
$name = preg_replace('#\/#mui', '', $name);

$file = file_get_contents($name);

// get defined macros
preg_match_all('#\#macro\h+(\w+)\h+(.*)$#mui', $file, $matches, PREG_SET_ORDER);

foreach ($matches as $m) {
    // delete macro definition
    $file = str_replace($m[0], '', $file);
    // substitute macro => value
    $file = str_replace($m[1], $m[2], $file);
}

// save processed file
$new_name = '/var/tmp/' . $name . '.pr';
file_put_contents($new_name, $file);

include_once $new_name;
exit;

现在有了这样的工具,使用起来很简单:

<?php

include_once "macro.php";

#macro DEBUG_INFO ;echo('<b>  DEBUG_INFO: __FILE__ : ' . __FILE__ . ';__LINE__ : ' . __LINE__ . '</b>')

echo '<br>'.(1/2); DEBUG_INFO;
echo '<br>'.(1/0); DEBUG_INFO;
echo '<br>'.(0/0); DEBUG_INFO;

执行输出时:

0.5 DEBUG_INFO: 文件 : /var/tmp/test.php.pr; : 7

INF DEBUG_INFO: FILE : /var/tmp/test.php.pr; : 8

NAN DEBUG_INFO: FILE : /var/tmp/test.php.pr; : 9

我有很强的C背景,总是想念PHP中类似C的宏。但希望我们能为它注入某种替代品。


推荐