账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    为什么 PHP 函数只有 Too few arguments 而没有 Too many arguments 的错误?
    66
    0

    众所周知,当我们传少了参数到 PHP 函数的时候,会报 PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function xxx() 的错误,比如:

    <?php
    function hello($name)
    {
        echo "Hello, {$name}" . PHP_EOL;
    }
    
    hello();
    
    // Fatal error: Uncaught ArgumentCountError: Too few arguments to function hello(), 0 passed in D:\tmp\hello.php on line 7 and exactly 1 expected in D:\tmp\hello.php:2

    那如果我们将函数改写成下面这样呢?

    <?php
    function hello()
    {
        echo "Hello" . PHP_EOL;
    }
    
    hello("world");
    
    // Hello

    居然不会抛出 Too many arguments to function hello() 的错误!难道是 world 这个字符串被扔掉了而没有传进去?

    将上面的函数再改一下:

    <?php
    function hello()
    {
        foreach (func_get_args() as $arg)
        {
            echo $arg . PHP_EOL;
        }
    }
    
    hello("world");
    hello("foo", "bar", "baz");
    
    // world
    // foo
    // bar
    // baz

    全都已经传进去了呀!带着好奇心搜了一下,发现 StackOverflow 上已经有人问过这个问题了:
    https://stackoverflow.com/que...

    但是高票回答只是简简单单的一句话:

    PHP doesn't throw an error on function overload.

    然后还从评论区里翻到了这么一个 bug report:https://bugs.php.net/bug.php?...
    官方给出的是 Wont fix,(not a bug but a feature???)

    除了上面两个链接之外,还找到了这个:
    http://www.php-internals.com/...
    但是看不太懂...


    目前我能找到的资料就这些,很好奇但是又不是很清楚是怎么回事,先问几个问题:

    1. PHP 的函数参数最后是不是有个隐式的可变长参数
    2. PHP 的函数传参是怎么实现的?
    3. 像代码段 1,是不是其实正常传参的时候函数内部已经隐式使用 func_get_args() 帮我们把第一个参数值装到 $name 里面去了?

    然后再问一个问题:

    像我这种没多少底层经验的新手,如果想阅读 PHP 的源码,该如何读起?把 php-internals 啃一遍会有帮助吗?
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 过去、那是昨天 普通会员 1楼

      PHP函数的参数数量应该在函数定义中明确指定。如果你在一个函数中声明了太多参数,PHP解释器会抛出 Too Many Arguments 错误。然而,PHP函数的官方文档并没有明确说明,为何某些函数会没有 Too Many Arguments 错误。

      这可能是由于一些特殊情况引起的。例如,某些函数可能需要一个或者多个额外的参数,但在函数定义中没有明确指出。或者,这些参数可能在函数调用时被替换,而不是被传递给函数。此外,还有一些函数可能在函数调用时不需要任何参数。

      如果你想让 PHP 函数没有 Too Many Arguments 错误,你需要确保在函数定义中明确指定函数的参数数量,并在调用函数时提供足够的参数。如果你不确定,你可能需要查阅 PHP 的官方文档或者咨询 PHP 的开发者。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部