我所讨论的参数是- __FILE__
和__LINE__
函数调用者的参数,以便函数可以在错误报告中使用它们.
假设我my_func()
在file_2.php中有两个文件和第100行file_1.php调用
我想打电话my_func(__FILE__, __LINE__)
,如果my_func
遇到错误,可以在第100行报告file_1.php.
我这样做,因为有数百个调用my_func
和报告错误在my_func()本身可能没有提供信息(除非我转储堆栈).而且我不想手动输入这两个参数几百次.
CI会做类似的事情#define MY_FUNC my_func(__FILE, __LINE)
- 我可以在PHP中做类似的事吗?
rye*_*guy 12
不幸的是,PHP没有任何类型的宏.您可以通过运行命令行工具来实现这些,例如sed
通过某些输入来插入宏,但这很容易出错并且有点草率.
要执行您想要执行的操作,您可以考虑使用debug_backtrace函数.
您可以在源文件重写的帮助下复制类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;
Run Code Online (Sandbox Code Playgroud)
现在有了这样的工具,用法很简单:
<?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;
Run Code Online (Sandbox Code Playgroud)
执行时输出:
0.5 DEBUG_INFO:FILE:/var/tmp/test.php.pr; 线:7
INF DEBUG_INFO:文件:/var/tmp/test.php.pr; 线:8
NAN DEBUG_INFO:文件:/var/tmp/test.php.pr; 线:9
我有很强的C背景知识,并且总是想念PHP中类似C的宏。但是希望我们可以为其注入某种替代品。