php类型检查方法参数-值得吗?
我想知道您认为这里的最佳实践是什么——在PHP中键入check参数会给您带来很多好处吗?也就是说,与那些没有实现参数类型检查的项目相比,您是否在项目中看到了明显较少的bug?我在想这样的事情:php类型检查方法参数-值得吗?,php,parameters,typechecking,Php,Parameters,Typechecking,我想知道您认为这里的最佳实践是什么——在PHP中键入check参数会给您带来很多好处吗?也就是说,与那些没有实现参数类型检查的项目相比,您是否在项目中看到了明显较少的bug?我在想这样的事情: public function __construct($screenName, $createdAt) { if (!is_string($screenName) || !is_string($createdAt) { return FALSE;
public function __construct($screenName, $createdAt) {
if (!is_string($screenName) || !is_string($createdAt) {
return FALSE;
}
}
视情况而定。我通常会使用PHP中内置的高级对象((stdClass$obj,array$arr,MyClass$mine)),但是当涉及到较低级别的值时——特别是数字和字符串,它就没有那么有用了 例如,如果您有字符串“12345”,那么就有点难以区分它和数字
12345
对于其他一切,将数组意外转换为字符串是显而易见的。类实例被强制转换为字符串,如果它们没有
\uuuu-toString
,将使PHP大喊大叫。所以你唯一真正的问题是类有一个\uuuu-toString
方法,这确实限制了它出现的次数。我真的想知道它是否值得这样的开销。通常在使用skalar变量“types”的PHP应用程序中,绑定到实际的字符串输入(HTTP请求)。PHP使这变得更容易,因此可以将字符串输入转换为数字,以便您可以使用它进行计算等
但是,按照示例中的建议检查标量值并没有多大意义。因为标量族中几乎任何类型的变量都是字符串,或者至少可以用作字符串。对于您的类示例,问题是,检查变量类型是否有意义
对于您提出的代码,它没有任何意义,因为您退出构造函数时返回的为false代码>。这将结束构造函数运行并返回未正确初始化的对象
相反,如果构造函数参数未提供预期/所需的值类型,则应引发异常,例如InvalidArgumentException
撇开这一点不谈,并且想当然地认为对象构造函数需要在字符串和整数、bool或任何其他标量类型之间有所不同,那么您应该进行检查
如果不依赖于精确的标量类型,则可以将其转换为字符串
只需确保隐藏在对象中的数据始终完好无损,并且不可能将错误数据滑入私有成员 当您是唯一与方法交互的人时,更好的文档更为重要。标准方法定义注释为您提供了文档化的方法,这些方法可以轻松编译成API,然后在许多IDE中使用
但是,当您向其他人公开您的库或输入时,如果您的代码无法处理他们的输入,则最好进行类型检查并抛出错误。对用户输入进行类型检查可以保护您免受错误和黑客攻击,作为一个库,让其他开发人员知道他们提供的输入不是您期望的,这有时是很好的做法。检查函数参数是一个非常好的做法。我怀疑人们经常不这样做,因为他们的函数变得更大,代码变得更难看,可读性也更低。现在使用PHP7,您可以键入提示标量类型,但对于希望参数为两种类型之一的情况,仍然没有解决方案:数组或\Traversable实例(这两种类型都可以用foreach遍历)
在本例中,我建议查看来自的。示例中的_构造函数将具有以下外观:
public function __construct($screenName, $createdAt)
{
expectsAll(string, [$screenName, $createdAt]);
}
// or require a non-empty array, string or instance of \ArrayAccess
function first($sequence)
{
expects([nonEmpty, arrayAccess, string], $sequence);
return $sequence[0];
}
更多示例。如果您需要类型检查,请使用静态语言。我只使用了数组类型检查。然后我停止了重复使用不同类型的变量。我在计划周密和编写良好的项目中看到的bug更少了。这算吗?;)顺便说一句:$createdAt
也可能是时间戳(int
)或对象(DateTime
)。@KingCrunch:我不知道您使用的是哪一个PHP版本,但据我所知,字符串在整数值和对象上仍然返回false。@delnan:如果您错过了它,这个问题是关于PHP的;)