Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php类型检查方法参数-值得吗?_Php_Parameters_Typechecking - Fatal编程技术网

php类型检查方法参数-值得吗?

php类型检查方法参数-值得吗?,php,parameters,typechecking,Php,Parameters,Typechecking,我想知道您认为这里的最佳实践是什么——在PHP中键入check参数会给您带来很多好处吗?也就是说,与那些没有实现参数类型检查的项目相比,您是否在项目中看到了明显较少的bug?我在想这样的事情: public function __construct($screenName, $createdAt) { if (!is_string($screenName) || !is_string($createdAt) { return FALSE;

我想知道您认为这里的最佳实践是什么——在PHP中键入check参数会给您带来很多好处吗?也就是说,与那些没有实现参数类型检查的项目相比,您是否在项目中看到了明显较少的bug?我在想这样的事情:

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的;)