我曾经有过这样的经历:
function whatever($foo, $bar, $foobar, $barfoo)
后来就变成了:
function whatever($foo, $bar, $foobar)
不过,还是有一些代码实例执行以下操作:
whatever(1, 2, 3, 4);
也就是说,尽管参数$barfoo
已被删除,但他们仍在发送第四个参数。
遗憾的是,这从未被记录为任何类型的错误。
为什么不可以?我可以启用此功能吗?出于某种原因,这是不是一个好主意?
答案1
PHP 并不真正关心参数的数量,并且不会将多余的参数视为错误。关于函数参数PHP 确实非常灵活:
信息可以通过参数列表传递给函数,参数列表是一个逗号分隔的表达式列表。参数从左到右进行求值。
但是,在这种情况下,您可以使用几个函数来发出警告:
func_num_args
— 返回传递给函数的参数的数量trigger_error
— 生成用户级错误/警告/通知消息
例如
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'