为什么解释器没有为第一个代码提供错误

时间:2018-04-24 05:24:51

标签: php

以下代码非常简单,但为什么PHP允许使用n个参数调用函数?

<?php

    function ab(){
        echo "yes";
    }

    ab(2);
?>

//output
yes

然而,下面的代码提供警告:ab()缺少参数2,但仍然提供输出

<?php
    function ab($a, $b){
        echo "yes";
    }

    ab(2);
?>

//output
yes

我知道这个警告是可以的,但我的问题是关于第一个代码。

2 个答案:

答案 0 :(得分:1)

我可以给你答案,这是一种简单的方法,因为没有人能给出答案。 (如果有人以比我更好的方式给出答案,我感激不尽。)

嗯,据我所知this link.

根据您的问题,我们可以看到您已经定义了两个参数并且您正在使用一个参数进行调用。

你得到的 警告 因为这个功能让你注意到你做错了什么。

当您调用此功能时,它会为您提供运行时警告,并且很可能会导致错误。

由于这不是致命错误,因此不会停止执行脚本。

由于脚本的执行没有停止,因此会以警告为您提供输出。

<强>更新:

正如您所询问的那样,将尽力为答案做好准备。

函数(function ab($a, $b))将初始化变量,但在运行时不会检查启动。

该函数计算参数本身的数量。当您调用的函数少于您在函数中定义的参数个数时,将给出警告。 (Warning: Missing argument 2 for ab()

<?php
    function ab($a, $b){
        echo "yes";
    }

    ab(2);
?>

现在,如果您传递的参数多于定义的参数,则不会给您任何警告,因为它满足(两个)参数。

<?php
    function ab($a, $b){
        echo "yes";
    }

    ab(1,2,3,4,5);
?>

在这里,我尽力而为,只能得到这个答案。希望你明白。 感谢。

答案 1 :(得分:1)

能够传递可变数量的参数用于可变参数函数,PHP中的一个例子是array_merge(),手册定义为

  

array array_merge(array $ array1 [,array $ ...])

所以你可以拥有......的代码。

$a4 = array_merge($a1, $a2);
$a5 = array_merge($a1, $a2, $a3);

两者都是完全有效的,只是在传入时合并多个数组。

在较新版本的PHP 5.6+中,他们添加了...运算符,因此您的定义可以更正式地定义为

function ab(...$values){
    echo "yes";
}

这是http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list

在5.6之前,您必须使用func_get_args()来访问这些值(您仍然可以)。