php类型检查方法是否值得


php type checking for method is it worth it?

我想知道你认为这里的最佳实践是什么——在PHP中键入检查参数对你来说很划算吗?I.e在已经实现了参数类型检查的项目中,与没有实现的项目相比,您是否确实看到了明显更少的错误?我在想这样的东西:

public function __construct($screenName, $createdAt) {  
        if (!is_string($screenName) || !is_string($createdAt) {
            return FALSE;
        }
}

通常,在使用skalar变量"types"的PHP应用程序中,实际绑定到字符串输入(HTTP请求)。PHP使这更容易,因此可以将字符串输入转换为数字,以便您可以使用它进行计算等。

然而,如您的示例中所建议的那样检查is_string的标量值并没有多大意义。因为标量族中几乎任何类型的变量都是字符串,或者至少可以用作字符串。因此,对于您的类示例,问题是,检查变量类型是否真的有意义?

对于您提出的代码,它没有任何意义,因为您使用return false;退出构造函数。这将结束构造函数的运行,并返回一个未正确初始化的对象。

相反,如果构造函数参数没有提供期望/需要的值类型,则应该抛出异常,例如InvalidArgumentException

抛开这一点不谈,想当然地认为对象构造函数需要在字符串和整数、布尔或任何其他标量类型之间有所不同,那么您应该进行检查。

如果您不依赖于精确的标量类型,则可以强制转换为字符串。

只要确保隐藏在对象中的数据始终完全正确,错误的数据就不可能滑入私人成员中。

这取决于情况。我通常会使用PHP中内置的类型提示来处理更高级别的对象((stdClass$obj、array$arr、MyClass$mine),但当涉及到较低级别的值时,尤其是数字和字符串,它会变得不那么有用。

例如,如果您有字符串'12345',那么区分它和数字12345会变得有点困难。

对于其他一切,意外地将数组强制转换为字符串将是显而易见的。被转换为字符串的类实例,如果它们没有__toString,将使PHP大喊大叫。所以,你唯一真正的问题是那些有__toString方法的类,这确实限制了它出现的次数。我真的很怀疑这样的开销是否值得。

检查函数参数是一种非常好的做法。我怀疑人们通常不会这样做,因为他们的函数越来越大,代码变得越来越丑陋,可读性越来越差。现在使用PHP7,您可以键入提示标量类型,但对于希望参数为两种类型之一的情况,仍然没有解决方案:数组或''Traversable实例(两者都可以使用foreach遍历)。

在这种情况下,我建议查看NSPL中的args模块。示例中的__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];
}

这里有更多的例子。

当您是唯一一个与方法交互的人时,更好的文档更为重要。标准方法定义注释为您提供了文档齐全的方法,这些方法可以很容易地编译成API,然后在许多IDE中使用。

不过,当你向其他人公开你的库或输入时,如果你的代码无法处理他们的输入,那么进行类型检查并抛出错误是很好的。对用户输入进行类型检查可以保护您免受错误和黑客攻击,作为一个库,让其他开发人员知道他们提供的输入不是您所期望的,这有时很好。