PHP 8.4 终于来了,带来了令人兴奋的变化,这些变化将改变开发人员的工作方式!随着每一个新版本的出现,PHP 都不断证明为什么它是当今 Web 开发领域如此重要的工具。
本文假设您具备 PHP 编程语言的基本知识。
Laravel Herd:用于管理我的 PHP 版本和 Nginx 服务器。
PHPStorm:一款出色的 IDE,具有良好的 IntelliSense 和 AI 副驾驶功能。
Laragon:一个易于使用的本地开发环境,支持 PHP 等技术。
在 PHP 中,对象属性的可见性传统上是对称的。这意味着属性的 get 和 set 操作必须共享相同的可见性(公共、私有或受保护),但不能不同。
例如,如果一个属性是公共的,则对其的读取和写入都是公共的,无法允许其中一个操作而没有另一个操作。
在上下文中,当您将类的属性声明为公共时,它就会变得可变,从而允许从类外部读取和修改它。
但是,随着不对称可见性的出现,您现在可以定义单独的范围来读取和写入属性。
这意味着属性可以在一种上下文中可读,在另一种上下文中可写,从而更好地控制属性的访问和修改方式。
class Animal{ public private(set) string $name; public setName(string $foo){ $ths->name = $foo; } } $animal = new Animal(); echo $animal->name; // This will run correctly
我们可以将一个属性设为公开,并将设定的属性设为私有。这意味着该属性无法在类外部更新,从而使其不可变。
如果您尝试修改 $name 属性,您将收到一条错误,显示由于可见性范围而无法修改该属性。
以下是关于不对称可见性需要注意的几个要点:
set-visibility 声明中不允许有空格。私人(设置)是正确的。 private( set ) 不正确,会导致解析错误。
如果属性被声明为公共,则可以省略主要可见性。例如,public private(set) 和 private(set) 的行为相同,因为隐含了公共可见性。
只有类型化属性才允许对集合操作具有单独的可见性。这意味着您无法将非对称可见性应用于 PHP 中的非类型化属性。
设置的可见性必须与获取的可见性相同或更严格。例如,public protected(set) 和 protected protected(set) 是有效的,但 protected public(set) 会导致语法错误。
了解有关不对称可见性的更多信息,包括供您细读的其他示例。
Property hook 是 PHP 8.4 的一个很棒的功能,它为开发人员引入了一种直接向变量添加 get 和 set 指令的方法,而无需明确创建读取和写入变量的方法。
或者,可以使用 __get 和 __set 魔术方法,但这会使代码更加冗长,可能会引入错误,并破坏静态分析工具。
可以肯定地说,属性钩子的设计和语法与 Kotlin 类似,但主要受 C# 和 Swift 编程语言的影响。
在 PHP 8.3 中,我们可以创建一个在其构造函数中包含属性的类,并且它使我们能够读取和写入该属性。
class Animal{ public private(set) string $name; public setName(string $foo){ $ths->name = $foo; } } $animal = new Animal(); echo $animal->name; // This will run correctly
这种方法的问题在于,当我们决定写入属性时,我们要么使用 __set 魔术方法,要么明确地创建一个方法来改变变量,这可能会导致代码库中断。
属性挂钩允许开发人员在创建属性后立即创建 set 指令。
class Car { public function __construct(public string $model) { } }
请注意,传递给 set 指令的值必须与属性的类型相同,否则会抛出错误。
您可以将另一种类型传递给 set 指令,并在写入属性之前将其转换为正确的类型,如下所示:
class Car{ public string $model{ set (string $value) { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } } }
上面的示例展示了我们如何安全地从 set 指令接收复合类型变量并将其解析为属性定义的正确类型。
如果传递给 set 指令的参数与属性类型相同,则可以省略。例如,下面的两个方法都是有效的并且行为类似。
class Car{ public string $year{ set (string|number $value) { $year = intval($value); if($year < 2000){ throw new ValueError("We only accept cars produced in year 2000 and above"); } $this->year= $value; } } }
请注意,如果省略参数,则默认为 $value。这种语法在 Kotlin 和 C# 等编程语言中很常见。
在此功能之前,在 PHP 中访问类的成员需要在类周围添加额外的括号。
// --------------------------METHOD 1---------------------------- public string $model{ set (string $value) { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } } // --------------------------METHOD 2---------------------------- public string $model{ set { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } }
如果不将 new Car() 调用括在括号中,则会出现解析错误。
新语法允许我们访问方法、属性和常量,而无需额外的括号。
class Car { public function getName(){ return "Toyota Camry"; } } $carName = (new Car())->getName();
有关此提议更改的完整详细信息,请查看 RFC 中的详细信息。
PHP 8.4 即将推出新的辅助函数。
其中一些函数已经在 Laravel Arr 或 Collection 助手中实现。
array_find_key() 函数
array_find_key($array, $callback) 函数返回 $callback 方法返回 true 的第一个元素的键。如果没有元素满足条件,函数返回 null。
class Animal{ public private(set) string $name; public setName(string $foo){ $ths->name = $foo; } } $animal = new Animal(); echo $animal->name; // This will run correctly
array_find() 函数
array_find_key() 函数旨在搜索数组并返回满足回调函数定义的条件的第一个元素的键。
与 array_find_key() 类似,如果没有找到匹配的元素,则返回 null。
class Car { public function __construct(public string $model) { } }
如果数组中没有水果的数量大于 10,该函数将返回 null。
array_any() 函数
array_any() 函数确定数组中的至少一个元素是否满足所提供的评估函数指定的特定标准。
如果至少有一个元素满足条件,函数返回true;否则,返回 false。
class Car{ public string $model{ set (string $value) { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } } }
如果数组中没有数字大于 10,函数将返回 false。
array_all() 函数
array_all() 函数检查数组中的每个项目是否通过特定测试。它对每个项目应用特殊规则(回调函数)。
如果所有项目都根据规则通过测试,则 array_all() 返回 true。
class Car{ public string $year{ set (string|number $value) { $year = intval($value); if($year < 2000){ throw new ValueError("We only accept cars produced in year 2000 and above"); } $this->year= $value; } } }
在此示例中,array_all() 函数将迭代 $numbers 数组并将回调函数应用于每个元素。回调检查数字是否能被 2 整除(即偶数)。
由于数组中的所有数字都是偶数,因此 array_all() 函数将返回 true,并显示消息“所有数字都是偶数”。将显示。
我们已经研究了 PHP 8.4 中引入的关键改进。这些更新为开发人员提供了宝贵的增强功能,包括强大的新功能和潜在的效率提升。
要深入了解所有更新,包括示例和详细说明,请访问官方 PHP 8.4.0 发布公告页面。
不要忘记查看弃用和向后兼容性更改,以确保顺利过渡到最新版本。
如果您喜欢这篇文章,请不要忘记与他人分享。
我很想听听您的想法 - 请在下面发表评论,让我们继续对话。干杯! ?
关注我,获取更多 PHP、Node.js、TypeScript 和 PHP 文章!您还可以在 Twitter 或 LinkedIn 上找到我。
以上是PHP:主要功能和改进的详细内容。更多信息请关注PHP中文网其他相关文章!