PHP 7.4类型属性实例详解( 二 )


declare(strict_types=1);$bar = new Bar;$bar->i = '1'; 上述语句以错误类型赋值时候,在严格类型检查(strict_types=1)下会抛出严重错误:
Fatal error: Uncaught TypeError:
Typed property Bar::$i must be int, string used
类型变量和继承
尽管PHP 7.4引入了改进的类型变量,但类型属性仍然是不变的 。这意味着以下内容无效:
class A {}class B extends A {}class Foo{ public A $prop;}class Bar extends Foo{ public B $prop;}Fatal error: Type of Bar::$prop must be A (as in class Foo)
如果上面的看起起不明显,再举个例子:
class Foo{ public self $prop;}class Bar extends Foo{ public self $prop;}在运行代码之前,PHP将使用它引用的具体类后台替换self 。所以上面的代码也会抛出相同的错误 。处理它的唯一正确姿势是:
class Foo{ public Foo $prop;}class Bar extends Foo{ public Foo $prop;}说到继承,可能会发现很难找到任何好的用例来覆盖继承属性的类型 。
值得注意的是,可以更改继承属性的类型,但前提是访问修饰符也从私有更改为protected或public 。下面代码是正确的:
class Foo{ private int $prop;}class Bar extends Foo{ public string $prop;}不允许将类型从可空变为非可空,反之亦然 。
class Foo{ public int $a; public ?int $b;}class Bar extends Foo{ public ?int $a; public int $b;}Fatal error: Type of Bar::$a must be int (as in class Foo)
总结
本文我们以类型化属性是PHP为例介绍了PHP 7.4带来的新的变化和加强,更多的功能,可以参考PHP RFC 。对于即将到来的7.4版本和后面可期的PHP 8 ,我们只有以活到老,学到老的态度才能跟上新技术的步伐 。"求求你别更新了,我快跟不上啦!"绝非一个IT人应该有的态度!




推荐阅读