【问题标题】:Can I make a PHP "macro" (like #define) to supply parameters for function calls?我可以制作一个 PHP“宏”(如 #define)来为函数调用提供参数吗?
【发布时间】:2010-10-12 02:37:26
【问题描述】:

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

假设我有两个文件,file_1.php 的第 100 行在 file_2.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 中做类似的事情吗?

【问题讨论】:

    标签: php macros


    【解决方案1】:

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

    要做你想做的事,你可以考虑debug_backtrace函数。

    【讨论】:

    • 7 或 8 年后,我再次发现了这个问题,并认为我会说我将 Mojtab 的异常答案结合使用,并按照此处的建议进行回溯
    【解决方案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;LINE:7

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        不幸的是,PHP 中没有类似 C 的宏。

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

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

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-26
        • 2013-04-15
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多