是否需要验证功能参数


Is it necessary to validate function parameters or not?

当我写下一个函数时,验证函数的所有参数是一个很好的做法,如下所示:

<?php
/**
 * foo - Test function
 *
 * @param int $paramA
 * @param str $paramB
 * @param array $paramC
 *
 * @return something
 */
function foo($paramA, $paramB, $paramC) {
    // verify all parameters
    if(!is_int($paramA)) {
        return 0; // or error msg
    }
    if(!is_string($paramB)) {
        return 1; // or error msg
    }
    if(!is_array($paramC)) {
        return 2; // or error msg
    }
    // some code in function scope that uses parameters 
    // and saves the results in $result
    return $result;
}

还是我应该依赖将使用该函数的用户,并假设他知道自己在做什么,而忘记参数验证?

就我个人而言,我更喜欢验证函数的所有参数并返回错误代码,以确保代码的一致性,并使我的生活更轻松。

提前谢谢。

我认为答案是:这取决于

这取决于你为谁编写代码。如果您正在寻找最通用的答案,那么,您应该这样做。

如果你的剧本只会被你使用,并且你心里知道你会一直正确使用它,那么如果你不这样做,你(可能(会很安全。

如果您的脚本是API的一部分,该API将分发给许多人,那么您肯定希望添加错误检查,并为人们提供良好的后退错误消息。

如果你是一个小团队的一员,他们都将使用相同的代码,我还建议根据你的特定上下文验证你的论点是个好主意。

如果它是一个只有您才会使用的内部函数,那么可能不需要验证每个这样的参数。如果函数的参数取决于用户输入(例如,您通过$_GET获取信息,然后将其传递给函数(,则需要对其进行验证。

永远不要依赖用户或除你之外的任何人来知道他们在做什么。有时,如果您正在编写以后可以重复使用的代码(比如您正在编写自己的框架以在所有PHP项目中使用(,验证这样的东西会很有帮助。但是,如果它只是一个特定于应用程序的函数,只有你才能用只有你定义的参数调用,我就不会担心了

为什么要验证您的参数:

  • 有时我们确实需要一个特定的数据类型来进行操作如果你给我一个不代表整数的字符串,并且你用它来搜索数据库中的主键(通常是int(,那么你会遇到麻烦
  • 它使修复代码变得更容易当您检查参数时,您可以抛出单独的异常,并给出非常描述性的消息。这使得在出现问题时更容易修复代码,因为您确切地知道出了什么问题

关于类型检查的一些提示:

  • 如果你不知道的话,is_int有相当大的故障我认为查看它是否为int的有效检查是is_numeric($int) && $int==(int)$int
  • 您可以为对象和数组指定类型,例如:function foo($paramA, $paramB, array $paramC)

实际上取决于您对这些参数所做操作的类型严格性。

由于PHP是弱类型的,所以可以通过强制转换或只让隐式类型转换/强制来完成很多任务。

如果你只是想在每个函数的头部抛出一堆保护条件,结果却返回错误,那么这与PHP触发自己的错误没有太大区别。

我不同意。我最近偶然发现了一篇关于类似问题(null检查(的文章,但它似乎也适用于php中的类型检查。我同意作者的观点。

  • 以使类型检查变得多余的方式编写代码
  • 显式验证用户输入并尽快将值强制转换为所需类型
  • 在某些特殊情况下,您可以也应该使用异常,而不是返回一些模糊的错误号

验证函数参数是一种非常好的做法。我怀疑你问这个问题是因为另一方面它会让你的功能看起来更长更丑。然而,使用来自NSPL的args模块,这很容易做到

function foo($paramA, $paramB, array $paramC) 
{
    expects(int, $paramA);
    expects(string, $paramB);
    // do something
}
// or type check several arguments
function sum($x, $y)
{
    expectsAll(numeric, [$x, $y]);
    return $x + $y;
}

这里有更多的例子。