函数名($param, $line = __LINE__, $file = __FILE__) ;

Posted

技术标签:

【中文标题】函数名($param, $line = __LINE__, $file = __FILE__) ;【英文标题】:function name($param, $line = __LINE__, $file = __FILE__) ;函数名($param, $line = __LINE__, $file = __FILE__) ; 【发布时间】:2010-08-02 11:38:15 【问题描述】:

是否可以让函数自动包含行号和调用该函数的文件,

就像我在函数中调用 __LINE____FILE__ 一样,它将使用函数定义所在的行和文件。

但我不想每次都将__LINE____FILE__ 传递给函数。

所以如果我将它们设置为默认参数,它们是来自函数定义还是从哪里调用?

【问题讨论】:

【参考方案1】:

按照你的建议去做似乎没有用。

您可以这样做,但我不确定您为什么要这样做,并且没有更好的方法来实现您想要实现的目标 - 请参阅 Wrikken's answer。

<?php

function test() 
    $backtrace = debug_backtrace();
    $last = $backtrace[0];
    echo "$last['function']() called from $last['file'] line $last['line']\r\n"; 




test();

【讨论】:

【参考方案2】:

唯一的方法是使用debug_backtrace(),但顾名思义:它是用于调试的。您的代码应根据调用位置/时间在生产中附加任何含义或功能。

【讨论】:

请问为什么这么糟糕? (1) debug_backtrace 有相当多的开销 (2) 你的函数行为对于其他开发人员来说是不可预测的(装饰器或可能只是适当的私有/受保护/公共方法,取决于具体情况,会很远更容易识别的解决方案)(3)功能突破了它的自我封闭/独立性,这是设计有问题的最确定的迹象。 @Hailwood 在生产环境中的所有内部细节都应该被记录下来,而不是向用户显示。这就是 Wrikken 所说的。出于调试目的,有一个名为trigger_error 的函数将幸运地自动添加文件和行,根据当前的错误处理设置输出错误消息 - 显示或日志文件。很方便【参考方案3】:

太晚了,但也许有用,你可以使用 get_call_class(),作为被调用的类的名称,不要像 CLASS 的参数一样传递。

【讨论】:

【参考方案4】:

如果您想在某种错误消息中使用此信息,有一个函数trigger_error() 会引发 PHP 原生错误,因此,它将以通常的 PHP 方式显示 - 带有文件名、行号和提供的文本。

此函数最简洁的功能是根据当前的错误处理设置进行操作:

ini_set('display_errors',1);
trigger_error("Horrible bug found!");

会直接打印出这样的错误信息:

Notice: Horrible bug found! in /path/file.php on line 2

非常适合开发 而这段代码

ini_set('display_errors',0);
ini_set('log_errors',1);
trigger_error("Horrible bug found!");

将被放入错误日志以供将来参考 生产必备

【讨论】:

以上是关于函数名($param, $line = __LINE__, $file = __FILE__) ;的主要内容,如果未能解决你的问题,请参考以下文章

__LINE__的用法

STM32里面的一些小函数——assert_param,PUTCHAR_PROTOTYPE

NSLog函数名文件名和行号

使用 __LINE__ 为不同的变量名创建宏[重复]

包装函数的函数名? [复制]

C语言模块打印打印printf,行号和函数名