PHP 7.4 将推出类型化属性
发布于 作者 Paul Redmond
该 类型化属性 2.0 RFC 已经通过投票,支持票 70 票,反对票 1 票。由于类型化属性是语言更改,因此需要 2/3 的多数票。类型化属性更改是 PHP 7.4 的一个提案。
随着标量类型和返回值类型的引入,PHP 7 极大地提升了 PHP 类型系统的功能。但是,目前无法为类属性声明类型,迫使开发人员使用 getter 和 setter 方法来强制执行类型契约。这需要不必要的样板代码,使用起来不太符合人体工程学,还会影响性能。本 RFC 通过引入对一流属性类型声明的支持来解决此问题。
该 RFC 提供了一个例子,目标是强制执行类型安全
class User { /** @var int $id */ private $id; /** @var string $name */ private $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; } public function getId(): int { return $this->id; } public function setId(int $id): void { $this->id = $id; } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; }}
使用新的已接受的 RFC,该代码可以按如下方式进行功能等效,“不会牺牲类型安全”
class User { public int $id; public string $name; public function __construct(int $id, string $name) { $this->id = $id; $this->name = $name; }}
最后,这里是一个在运行时强制执行的类型化属性注释中支持的所有有效类型的示例
class Example { // All types with the exception of "void" and "callable" are supported public int $scalarType; protected ClassName $classType; private ?ClassName $nullableClassType; // Types are also legal on static properties public static iterable $staticProp; // Types can also be used with the "var" notation var bool $flag; // Typed properties may have default values (more below) public string $str = "foo"; public ?string $nullableStr = null; // The type applies to all properties in one declaration public float $x, $y; // equivalent to: public float $x; public float $y;}
从压倒性的 70 票赞成票和 1 票反对票中可以清楚地看出,PHP 内部团队希望继续将类型安全等类型功能引入 PHP 语言。
另一方面,PHP 可以完全不同的范式使用,即完全动态的语言,拥抱类型强制。但是,随着 PHP 7 中引入的新的类型安全功能的继续,使用完全动态的方法编写 PHP 应用程序是否实用尚不清楚。
例如,如果像 Symfony 组件和事实上的 PHP 测试框架 PHPUnit 这样的通用库实现了这种类型的语法,使用这些库的包使用者需要随之进行,并适应这种以类型为中心的语言的新世界。
有些人可能会争辩说,强制采用以类型为中心的方法是一件好事,它将使程序员编写出更好的程序,并减少错误。除了这种论点之外,静态分析工具很可能能够提前检测到运行时错误。
至少对我来说,这种类型的讨论很少围绕类型安全使代码更好的具体证据,更多的是围绕假设场景,这些场景很难辨别类型安全是否使代码“更好”。
我不知道动态程序员和强类型程序员之间的编程风格差异是否会扩大。对我来说,似乎语言功能不可避免地会回避动态编程风格,因为开发人员对强类型语言的偏好日益增加。
对于那些想要在没有类型的情况下进行编程的人来说,这意味着什么呢?只有时间能证明一切,但我预测,至少一小部分希望语言保持其动态根源的程序员将转向其他语言。
了解更多
要了解更多信息,rfc:typed_properties_v2 提案是目前获取准确信息的最佳来源。类型化属性的实现 已经在进行中。