是否有某种方法可以让 PHP 在调用带有过多参数的函数时记录警告/通知/错误?

是否有某种方法可以让 PHP 在调用带有过多参数的函数时记录警告/通知/错误?

我曾经有过这样的经历:

function whatever($foo, $bar, $foobar, $barfoo)

后来就变成了:

function whatever($foo, $bar, $foobar)

不过,还是有一些代码实例执行以下操作:

whatever(1, 2, 3, 4);

也就是说,尽管参数$barfoo已被删除,但他们仍在发送第四个参数。

遗憾的是,这从未被记录为任何类型的错误。

为什么不可以?我可以启用此功能吗?出于某种原因,这是不是一个好主意?

答案1

PHP 并不真正关心参数的数量,并且不会将多余的参数视为错误。关于函数参数PHP 确实非常灵活:

信息可以通过参数列表传递给函数,参数列表是一个逗号分隔的表达式列表。参数从左到右进行求值。

PHP 支持按值传递参数(默认),通过引用传递, 和默认参数值可变长度参数列表 也受到支持。

但是,在这种情况下,您可以使用几个函数来发出警告:

例如

function foo( $one, $two, $three )
{
    if ( func_num_args() > 3 ) {
        trigger_error( "Too many arguments passed to function foo", E_USER_WARNING );
    }
}

由于您的目标是找到仍然以旧方式调用此函数的行,因此最好添加一些跟踪,例如debug_backtrace

<?php
function foo( $one, $two, $three )
{
    if ( func_num_args() > 3 ) {
        $trace = json_encode( debug_backtrace() );
        trigger_error( "Too many arguments for foo: " . $trace, E_USER_WARNING );
    }
}
foo( "one", 2, "three", 4 ); // the old way, line 9
foo( "one", 2, "three" ); // current operation, line 10
?>

这样,警告将包含调用行和 JSON 格式的传递参数:

AH01071: Got error 'PHP message: PHP Warning:  Too many arguments for foo: 
[{"file":"\\/var\\/www\\/foo.php","line":9,"function":"foo","args":["one",2,"three",4]}] 
in /var/www/foo.php on line 6'

相关内容