【问题标题】:PHP Functions: more arguments than expectedPHP 函数:比预期更多的参数
【发布时间】:2019-10-23 18:55:31
【问题描述】:

PHP 代码1:

function f() {return 'hello world!';}

echo f().'<br>';
echo f(123).'<br>';
echo f(123, 'foo').'<br>';

输出:

hello world!
hello world!
hello world!

 

PHP代码2:

function g(int $x) {return 'hello world!';}

echo g(123).'<br>';
echo g(123, 'foo').'<br>';

输出:

hello world!
hello world!

问题

当传递的参数比函数预期的多时,是否可以强制 PHP 抛出错误?


相关问题

  1. Why does PHP not throw an error when I pass too many parameters to a function?

 

跟进

已经有一个 RFC 提出了一个 Strict Argument Count On Function Calls,不幸的是,由于被大量拒绝而被撤回。其中一些有趣的点是:

  • “在测试过程中,可以清楚地衡量,建议的严格参数计数检查不会成为问题。实际上,情况恰恰相反。这将有助于提高 PHP7 及以后的 PHP 代码质量,因为所有警告都对捕捉错误甚至错误。”
  • “由于许多争议点和全面拒绝,该 RFC 已被撤回,并且 RFC 作者不会再次提出。RFC 作者建议不要恢复此 RFC,因为它已经被拒绝了。”

还可以进行更深入的讨论:[PHP-DEV][RFC][DISCUSSION] Strict Argument Count

【问题讨论】:

  • 检查func_num_args()的返回值,看是否符合你的预期,如果不符合,则抛出错误。请注意,当您尝试使用不正确数量的参数调用函数时,使用现代 IDE 通常会很明显。
  • 我认为问题在于决定一个函数需要多少参数。如果有任何东西使用func_get_args(),则必须从代码中解决。
  • @PatrickQ > “检查 func_num_args() 的返回” 在每个单独的函数中包含 func_num_args 非常痛苦。还有其他更自动化的方法吗?
  • @PatrickQ > “注意使用现代 IDE” 介意推荐一款这样的 IDE 吗?
  • 您链接到的帖子有一个指向 bugs.php.net/bug.php?id=13892 的链接,涵盖了这一点。

标签: php function arguments


【解决方案1】:

正如其他人建议的那样,使用 ReflectionFunction 类。

<?php
function foo($bar, $baz) {
    $refFunc = new ReflectionFunction(__FUNCTION__);
    if(func_num_args() > $refFunc->getNumberOfParameters())
        throw new Exception('Too many arguments.');
}

foo(1,2,3);

会抛出异常。

或者更简单。把它放在函数的开头:

function bar($baz, $bat) {
    if(func_num_args()>count(get_defined_vars()))
        throw new Exception('Too many args.');
}

bar(1,2,3);

会抛出异常。

【讨论】:

  • 考虑到我更熟悉过程式编程,第二个代码似乎很简单。但是,仍然有必要在每个函数中插入这个 sn-p。有没有更自动化的方法?例如:是否存在自动警告参数过多的错误级别?
  • 您会因为参数太少而收到 PHP 警告。你可以用一条线来模仿它:if(func_num_args()&gt;count(get_defined_vars())) trigger_error('Too many arguments.', E_USER_WARNING);。我怀疑有一个内置的自动执行此操作。
  • 我添加了一个指向已撤消的相关 RFC 的链接:wiki.php.net/rfc/strict_argcount
  • 确实,非常有趣的链接。看到开发人员的行为非常好奇。他们得出的结论是这样的设置将“有助于提高 PHP 代码质量”,但是由于整体拒绝,该提案被撤回,作者建议不要再次恢复它。我想了解这背后的原因......
【解决方案2】:

在 Php 中,向函数传递的参数多于所需的参数并没有错,并且只有传递的参数少才会出错。

通过 func_num_args() 可以得到传递给函数的参数个数,但是如果你想知道你的函数实际上有多少个参数,你可以使用反射方法:

$method = new \ReflectionMethod('MyClassName', 'myFunction');
$method = new \ReflectionFunction('myFunction');
var_dump($method->getNumberOfParameters(), $method->getParameters());

【讨论】:

  • 问题是在每个单独的函数中都包含这个会很痛苦。如果有更自动化的解决方案就好了。
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2018-11-05
  • 2023-03-27
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 2018-02-03
相关资源
最近更新 更多