PHP 7.4 将推出类型化属性

发布于 作者

Typed Properties Coming to PHP 7.4 image

类型化属性 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 提案是目前获取准确信息的最佳来源。类型化属性的实现 已经在进行中。

Paul Redmond photo

Laravel News 的专栏作家。全栈 Web 开发人员和作家。

归类于
Cube

Laravel 新闻通讯

加入 40,000 多名其他开发人员,不错过任何新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自 No Compromises 播客的两名经验丰富的开发者,现在可以为您在 Laravel 项目中聘用。 ⬧ 固定费率 $7500/月。 ⬧ 没有漫长的销售流程。 ⬧ 没有合同。 ⬧ 100% 退款保证。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保您的 Web 应用程序成功。

Kirschbaum
Shift logo

Shift

运行旧版本的 Laravel?即时、自动化的 Laravel 升级和代码现代化,使您的应用程序保持新鲜感。

Shift
Bacancy logo

Bacancy

以每月仅 $2500 的价格,为您的项目配备经验丰富的 Laravel 开发人员(拥有 4-6 年的经验)。获得 160 小时的专业知识,并享受 15 天的无风险试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即幸运 - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带到 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 职位板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,它包含运行现代 SaaS 所需的所有功能。支付、漂亮的结帐、管理面板、用户仪表板、身份验证、现成的组件、统计、博客、文档等。

SaaSykit: Laravel SaaS 启动套件
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,助力公司取得成功

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成来增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解灵活、现代的 MongoDB 数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包将评论添加到您的 Laravel 应用程序

阅读文章