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

时间:2010-10-12 02:37:27

标签: php macros

我所讨论的参数是__FILE____LINE__ - 函数调用者的参数,以便函数可以在错误报告中使用它们。

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

我想拨打电话my_func(__FILE__, __LINE__),以便my_func遇到错误,可以在第100行报告file_1.php。

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

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

4 个答案:

答案 0 :(得分:11)

不幸的是,PHP没有任何类型的宏。您可以通过在某些输入上运行sed之类的命令行工具来插入宏来实现这些,但这很容易出错并且有点草率。

要做你想做的事,你可以考虑debug_backtrace功能。

答案 1 :(得分:3)

您可以在重写源文件的帮助下复制类似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; LINE :7

     

INF DEBUG_INFO:文件:/ var / tmp / test.php.pr; LINE :8

     

NAN DEBUG_INFO:文件:/ var / tmp / test.php.pr; LINE :9

我有很强的C背景,并且在PHP中总是错过了类似C的宏。但希望我们可以为它注入某种替代品。

答案 2 :(得分:2)

不。使用堆栈跟踪:debug_backtrace()。您只需查看返回数组中的第二行即可检索调用者的文件和行。

答案 3 :(得分:2)

不幸的是,PHP中没有类似Mac的C语言。

阅读debug_backtrace很棘手,我不喜欢这样。

我想在错误点抛出异常然后异常对象它自己包含堆栈跟踪以及它来自的行号和文件。

catch (Exception $e)
{
   $errorMessage  = $e->getMessage() . " LINE: " .$e->getLine(). " FILE: " . $e->getFile();
}