[关闭]
@Chiang 2020-02-14T13:54:59.000000Z 字数 1112 阅读 572

PHP7的新特性详解--标量定义(Scalar Typehints)

PHP7新特性 2020-02


PHP5.X

以前在PHP中,我们只需要在定义方法时,将参数的名称作为定义的一部分即可。

  1. function setId($id) {
  2. $this->id = $id;
  3. }

这段代码是完全合法的。 但是PHP不知道$id应该是什么,如果我们传递一个对象或数组,然后我们就可以使用typehint来防止意外的参数类型。

  1. function setPerson(Person $person) {
  2. $this->person = $person;
  3. }

在这一点上,这种方法只会让我们通过一个Person的对象,对于命名为setPerson()的方法,这是非常合情合理考虑。

但是到现在为止,还没有办法在PHP中对标量类型,做到这一点。

PHP7.X

在PHP 7,我们现在能够typehint这个标量参数,有效地确保我们只是通过一个我们期待类型的变量。

  1. function setId(int $id) {
  2. $this->id = $id;
  3. }

在这个例子中,你可以看到,我们指定的参数应该是int类型,如果我们试图传递任何其他非整数的参数,那么TypeException将被抛出

  1. setId('fishcakes');
  2. Fatal error: Uncaught TypeException: Argument 1 passed to setId() must be of the type integer, string given

警告

这里需要特别注意的是,默认情况下(至少在本文写作的时候),这并不像你想象的那样严格。

PHP 7将竭尽所能,试图找出它认为你试图要获得的数据,所以下面的例子将是有效的,即使我们传递一个字符串。

  1. function setId(int $id) {
  2. $this->id = $id;
  3. }
  4. setId('1');

很多开发者,包括我自己都觉得这种行为有点古怪,所以我们可以使用声明语句让PHP 7知道要启用严格的类型判断 。

严格类型

  1. declare(strict_types=1);
  2. function setId(int $id) {
  3. $this->id = $id;
  4. }
  5. setId('1');

顺便说一句,用1来设置严格类型判断,确保我不会迷失,不信你用'1'试试

  1. Fatal error: Uncaught TypeException: Argument 1 passed to setId() must be of the type integer, string given

这是意料之中的,因为我们正在给方法传递一个字符串值,而不是一个整数,所以抛出异常。


参考资料:
PHP饭米粒

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注