众所周知,当我们传少了参数到 PHP 函数的时候,会报 PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function xxx() 的错误,比如:
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
那如果我们将函数改写成下面这样呢?
function hello()
{
echo "Hello" . PHP_EOL;
}
hello("world");
// Hello
居然不会抛出 Too many arguments to function hello() 的错误!难道是 world 这个字符串被扔掉了而没有传进去?
将上面的函数再改一下:
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???)
目前我能找到的资料就这些,很好奇但是又不是很清楚是怎么回事,先问几个问题:
PHP 的函数参数最后是不是有个隐式的可变长参数?
PHP 的函数传参是怎么实现的?
像代码段 1,是不是其实正常传参的时候函数内部已经隐式使用 func_get_args() 帮我们把第一个参数值装到 $name 里面去了?
然后再问一个问题:
像我这种没多少底层经验的新手,如果想阅读 PHP 的源码,该如何读起?把 php-internals 啃一遍会有帮助吗?