2011-09-20 66 views
7

我习惯于在编写函数时检查我的参数类型。有没有这个原因呢?作为一个例子,在这段代码中保留字符串验证还是删除字符串验证是一种很好的做法,为什么?你应该验证PHP函数中的参数类型吗?

function rmstr($string, $remove) { 
    if (is_string($string) && is_string($remove)) { 
     return str_replace($remove, '', $string); 
    } 
    return ''; 
} 

rmstr('some text', 'text'); 

有些时候,你可能会想到不同的参数类型和运行它们不同的代码,在这种情况下,验证是必要的,但我的问题是,如果我们应明确检查的类型和避免错误。

+8

除非您制作API库或处理来自用户的输入,否则它是过度的。 – thedaian

+0

我想如果你写的每一个函数都做了这个,那么性能会逐渐衰减,特别是如果它们是只有你调用的内部/私有函数的话。 –

+0

我想这取决于如果你没有测试并且失败会发生什么。 – Steve

回答

5

我的意见是,如果您接受用户的输入,您应该执行此类验证。如果这些字符串不被用户接受或者被用户清理过输入,那么进行验证就会过度。

+0

我同意你的观点,我是那些每次都会检查的人之一(我总是害怕错误)。但通常这会导致混乱。我建议真的限制你的支票。 –

+2

为了让您知道,来自用户的所有数据都只有一种类型 - 字符串。因此,类型检查变得完全**无用** –

+0

这是一个很好的观点@ Col.Shrapnel,我想这使得从用户输入验证类型有点多余,除非您可能希望函数的用户直接在他们的代码中调用它,而不是而不是从表单传递。 –

6

是的,没关系。不过,php的开头并不是强类型的,所以我认为这在实践中并不是很有用。

此外,如果使用字符串以外的对象,异常是一个更多的信息;因此,我试图避免在最后返回一个空字符串,因为它不是在语义上解释调用rmstr(array,object)返回一个空字符串。

+0

是的,通常我在任何可能的地方使用return FALSE来避免在这样一个小函数中出现异常的开销,但是在这里我假设用户会期望从rmstr得到一个字符串,而不管他们的输入是什么。 –

+0

@Aram返回FALSE也没有错。它也会被转换为空 –

1

看来当地人把这个问题理解为“你应该验证参数”,它应该是“你应该验证参数类型”,并且做出无意义的回答和评论。

就我个人而言,我从不检查操作数类型,也从来没有遇到任何麻烦。

2

至于我,键入检查实际数据,从用户顶层抽象得到,但在此之后,当你调用大部分函数时,你现在应该已经是他们的类型了,并且不要每次都检查它方法。它影响性能和可读性。

注意:您可以添加信息,其类型,是由PHPDoc的

0

允许参数为你的函数这取决于你生产出的代码。如果它实际上是生产代码,则应确保您的功能在任何情况下都能正常工作。这包括检查参数是否包含您期望的数据。否则抛出一个异常或有其他形式的错误处理(你的例子完全失踪)。

如果不是用于生产使用,也不需要防守编码,那么可以忽略任何内容并遵循垃圾进出垃圾的原则(或三个垃圾原则:代码垃圾,进程垃圾,得到狗屎)。

最后,所有关于匹配的期望:如果你不需要你的功能正常工作,你不需要适当的代码。如果你实际上依赖于你的代码来精确地工作,你甚至需要验证每个单元(函数,类)的输入数据。