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

Maw*_*awg 13 php macros

我所讨论的参数是- __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函数.

  • 7或8年后,我再次发现这个问题并认为我会说我使用Mojtab的例外答案的组合,以及此处建议的回溯 (2认同)

Agn*_*kas 5

您可以在源文件重写的帮助下复制类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的宏。但是希望我们可以为其注入某种替代品。