从PHP 5.2到5.3的func_num_args,func_get_arg和func_get_args的行为差异

Som*_*one 9 php

我看过PHP手册.但我不明白早期版本和更高版本的PHP之间的行为差​​异.我不明白这句话:

由于此函数取决于当前范围以确定参数详细信息,因此不能将其用作5.3.0之前的版本中的函数参数.如果必须传递此值,则应将结果分配给变量,并且应传递该变量.

Ale*_*ett 11

如果要将其中一个函数的结果传递给另一个函数或方法,则在5.3之前的PHP版本中,必须先将结果赋给变量.

function some_func() {
    $args = func_get_args();
    some_other_func($args);
}
Run Code Online (Sandbox Code Playgroud)

在PHP 5.3中删除了此限制,您现在可以直接传递结果.

function some_func() {
    some_other_func(func_get_args());
}
Run Code Online (Sandbox Code Playgroud)

至于为什么这个限制首先存在,也许对PHP内部有更透彻理解的人可以给你一个更完整的答案.


net*_*der 8

这意味着在5.2中这是无效的:

function foo() {
    $array = array_map('strtolower', func_get_args());
}
foo('BAR', 'BAZ');
Run Code Online (Sandbox Code Playgroud)

它会因致命错误而中止:

PHP致命错误:func_get_args():不能用作函数参数

但是在5.3中,它是有效的代码.