@Chiang
2020-02-14T13:54:59.000000Z
字数 1112
阅读 572
PHP7新特性
2020-02
以前在PHP中,我们只需要在定义方法时,将参数的名称作为定义的一部分即可。
function setId($id) {
$this->id = $id;
}
这段代码是完全合法的。 但是PHP不知道$id应该是什么,如果我们传递一个对象或数组,然后我们就可以使用typehint来防止意外的参数类型。
function setPerson(Person $person) {
$this->person = $person;
}
在这一点上,这种方法只会让我们通过一个Person的对象,对于命名为setPerson()的方法,这是非常合情合理考虑。
但是到现在为止,还没有办法在PHP中对标量类型,做到这一点。
在PHP 7,我们现在能够typehint这个标量参数,有效地确保我们只是通过一个我们期待类型的变量。
function setId(int $id) {
$this->id = $id;
}
在这个例子中,你可以看到,我们指定的参数应该是int类型,如果我们试图传递任何其他非整数的参数,那么TypeException将被抛出
setId('fishcakes');
Fatal error: Uncaught TypeException: Argument 1 passed to setId() must be of the type integer, string given
这里需要特别注意的是,默认情况下(至少在本文写作的时候),这并不像你想象的那样严格。
PHP 7将竭尽所能,试图找出它认为你试图要获得的数据,所以下面的例子将是有效的,即使我们传递一个字符串。
function setId(int $id) {
$this->id = $id;
}
setId('1');
很多开发者,包括我自己都觉得这种行为有点古怪,所以我们可以使用声明语句让PHP 7知道要启用严格的类型判断 。
declare(strict_types=1);
function setId(int $id) {
$this->id = $id;
}
setId('1');
顺便说一句,用1来设置严格类型判断,确保我不会迷失,不信你用'1'试试
Fatal error: Uncaught TypeException: Argument 1 passed to setId() must be of the type integer, string given
这是意料之中的,因为我们正在给方法传递一个字符串值,而不是一个整数,所以抛出异常。
参考资料:
PHP饭米粒