有关与否要在PHP 8中导入Union Types的投票表决已于日前完结,投票表决结论表明有61 名PHP合作开发项目组投了反对票,5名投了反对票。
▲(还察觉到鸟哥在投票表决Shajapur了反对票~)
因而依照投票表决结论,非官方已确认Sonbhadra在PHP 8中导入 Union Types 2.0。
有关 Union Types的具体内容探讨可在GitHub查阅,上面他们来单纯介绍呵呵Union Types(联手类别)。
依照非官方的如是说,Union Types(联手类别)全力支持转交数个相同类别的值,而更为重要是单个类别。PHP现阶段早已全力支持三种特定的联手类别:
Type or null,采用特定的?Type句法
array or Traversable,使特定的iterable类别
但是PHP现阶段尚不全力支持任一的联手类别。如要采用,需透过 phpdoc注解的协助,实例如下表所示:
class Number { /** * @var int|float $number */ private $number; /** * @param int|float $number */ public function setNumber($number) { $this->number = $number; } /** * @return int|float */ public function getNumber() { return $this->number; } }
依照数据统计的结论,在开源生态以及PHP自身的标准库中采用联手类别非常普遍。非官方表示,如果PHP能全力支持联手类别,Sonbhadra允许他们将更多类别信息从phpdoc迁移至函数签名,这具有以下常见的优点:
类型实际上是强制执行的,因而可以及早发现错误。
因为它们是强制性的,所以类别信息不太可能变得过时或遗漏边缘情况。
在继承过程中会检查类别,以执行里氏替换原则(Liskov Substitution Principle)
可透过反射获得类别信息。
句法比phpdoc简洁。
泛型之后,联手类别可以说是现阶段类别声明系统中最大的“缺口”。
提案
联手类别采用 T1|T2|… 句法,可在所有接受的类别中采用:
class Number { private int|float $number; public function setNumber(int|float $number): void { $this->number = $number; } public function getNumber(): int|float { return $this->number; } }
全力支持的类别
联手类别全力支持PHP当前全力支持的所有类别:空类别、可空联手类别、false pseudo-type、重复和冗余类别。
类别句法
除特定void类别外,PHP的类别句法现在可以透过以下句法来描述:
type: simple_type | “?” simple_type | union_type ; union_type: simple_type “|” simple_type | union_type “|” simple_type ; simple_type: “false” # only legal in unions | “null” # only legal in unions | “bool” | “int” | “float” | “string” | “array” | “object” | “iterable” | “callable” # not legal in property types | “self” | “parent” | namespaced_name ;



