当我写下函数时,最好验证函数的所有参数,如下所示:
<?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;
}
或者我应该依赖将使用该功能的用户并假设他知道自己在做什么而忘记参数验证?
我个人更喜欢验证函数的所有参数并返回错误代码以保证代码的一致性,并使我的生活变得更轻松。
提前谢谢。
答案 0 :(得分:2)
我认为答案是:取决于
这取决于您编写代码的人。如果您正在寻找最通用的答案,那么是,您应该。
如果您的脚本只会被您使用,并且您在心中知道您将始终正确使用它,那么如果您不这样做,您将(可能)是安全的。
如果您的脚本是将分发给许多人的API的一部分,那么您肯定希望添加错误检查并为人们提供良好的后备错误消息。
如果您是一个将使用相同代码的小团队的一员,我还建议根据您的特定情况验证您的论点是个好主意。
答案 1 :(得分:0)
如果它只是你将使用的内部函数,那么可能不会像这样验证每个参数。如果它是一个具有依赖于用户输入的参数的函数(例如,您通过$_GET
获取信息,然后将其传递给函数),则需要对其进行验证。
永远不要依赖用户或自己以外的任何人知道他们在做什么。有时,如果您正在编写可以在以后重复使用的代码(例如,如果您编写自己的框架以在所有PHP项目中使用),那么验证这样的事情会很有帮助。但是如果它只是一个特定于应用程序的函数,只有你可以使用只有你定义的参数调用,我就不用担心了。
答案 2 :(得分:0)
为什么验证您的参数:
有关类型检查的一些提示:
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 module的NSPL,这很容易做到。您的示例中的函数将是:
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。