是否有必要验证功能参数?

时间:2011-10-11 20:53:26

标签: php

当我写下函数时,最好验证函数的所有参数,如下所示:

<?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;
}

或者我应该依赖将使用该功能的用户并假设他知道自己在做什么而忘记参数验证?

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

提前谢谢。

6 个答案:

答案 0 :(得分:2)

我认为答案是:取决于

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

如果您的脚本只会被您使用,并且您在心中知道您将始终正确使用它,那么如果您不这样做,您将(可能)是安全的。

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

如果您是一个将使用相同代码的小团队的一员,我还建议根据您的特定情况验证您的论点是个好主意。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

为什么验证您的参数:

  • 有时我们确实需要某种操作的特定数据类型。如果你给我一个不代表整数的字符串,你可以用它来搜索数据库中的主键(通常一个int),那你就麻烦了。
  • 它使您的代码更容易修复。当您检查参数时,您可以抛出个别异常并提供非常具有描述性的消息。这样可以在出现故障时更轻松地修复代码,因为您确切地知道出了什么问题。

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

  • 如果您不知道,is_int非常错误。我认为有效检查是否为int is_numeric($int) && $int==(int)$int
  • 您可以指定对象和数组的类型,如下所示:function foo($paramA, $paramB, array $paramC)

答案 3 :(得分:0)

确实取决于您对这些参数所做的类型严格性。

由于PHP是弱类型的,你可以通过强制转换或者让隐式类型转换/强制执行它来侥幸逃脱。

如果你只是为了返回错误而在每个函数的头部抛出一堆保护条件,那与PHP触发它自己的错误真的没什么不同。

答案 4 :(得分:0)

我不同意见。我最近偶然发现an article关于类似问题(空检查),但它似乎也适用于php中的类型检查。我同意作者的观点。

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

答案 5 :(得分:0)

验证函数参数是一种非常好的做法。我怀疑你问这个问题,因为另一方面它使你的功能看起来更长,更丑。但是对于来自args moduleNSPL,这很容易做到。您的示例中的函数将是:

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;
}

更多示例here