我想知道你认为最好的做法是什么 - 它是否非常适合你在PHP中输入检查参数?实际上,您实际看到的是,在您实施参数类型检查的项目与不实现参数类型检查的项目中,错误明显减少了吗?我在考虑这样的事情:
public function __construct($screenName, $createdAt) {
if (!is_string($screenName) || !is_string($createdAt) {
return FALSE;
}
}
答案 0 :(得分:9)
通常在PHP应用程序中使用skalar变量“types”绑定到实际的字符串输入(HTTP请求)。 PHP使这更容易,所以将字符串输入转换为数字,以便您可以使用它进行计算等。
但是,检查示例中提出的is_string
的标量值没有多大意义。因为标量族中几乎任何类型的变量都是字符串,或者至少可以用作字符串。至于你的类示例,问题是,检查变量类型是否真的有意义?
对于您提出的代码没有任何意义,因为您使用return false;
退出构造函数。这将结束构造函数运行并返回一个未正确初始化的对象。
相反,你应该抛出异常,例如如果构造函数参数未提供预期/需要的值类型,则为InvalidArgumentException
。
抛开这一点并理所当然地认为你的对象构造函数需要在字符串和整数或bool或任何其他标量类型之间有所不同,那么你应该进行检查。
如果您不依赖于确切的标量类型,则可以转换为字符串。
确保隐藏在对象中的数据总是完全正确,并且错误的数据不可能进入私有成员。
答案 1 :(得分:6)
这取决于。我通常会使用内置于PHP中的type-hinting来获得更高级别的对象((stdClass $ obj,array $ arr,MyClass $ mine)),但是当涉及较低级别的值时 - 尤其是数字和字符串,它变得有点不太有益。
例如,如果您使用字符串'12345'
,那么区分字符12345
会变得有点困难。
对于其他所有内容,将数组意外转换为字符串将是显而易见的。如果没有__toString
,则转换为字符串的类实例将使PHP大喊大叫。因此,您唯一真正的问题是具有__toString
方法的类,并且实际上限制了它可以出现的次数。我真的很想知道是否值得花费这么高的开销。
答案 2 :(得分:2)
检查函数参数是一种非常好的做法。我怀疑人们经常不这样做,因为他们的功能越来越大,代码变得越来越丑陋和可读性越来越差。现在使用PHP 7,您可以键入提示标量类型,但是当您希望参数为两种类型之一时,仍然没有解决方案:数组或实例\ Traversable(两者都可以使用foreach遍历)。
在这种情况下,我建议您查看args module中的NSPL。示例中的__constructor将具有以下外观:
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];
}
更多示例here。
答案 3 :(得分:0)
当您是唯一与方法交互的人时,更好的文档更为重要。标准方法定义注释为您提供了记录良好的方法,可以轻松地将其编译为API,然后在许多IDE中使用。
当您将库或您的输入公开给其他人时,如果您的代码无法使用其输入,那么进行类型检查并抛出错误会很好。对用户输入进行类型检查可以保护您免受错误和黑客攻击,并且作为一个库让其他开发人员知道他们提供的输入不是您所期望的有时很好。