在PHP中创建严格键入的数组和收集
钥匙要点
-
php 5.6引入了使用…代币创建键入数组的能力,该功能或方法表示函数或方法接受可变的参数长度。可以将此功能与类型提示结合在一起,以确保仅在数组中接受某些类型的对象。
- >此功能的一个限制是,每个方法只能定义一个键入的数组。为了克服这一点,可以将键入的数组注入“集合”类中,这也允许比Get Methods上的“数组”更具体的返回类型。
- 。 值对象可用于自定义验证。例如,可以使用约束来创建一个评分值对象,以确保评级始终在0到5之间。这提供了单个收集成员的其他验证,而无需循环每个注入的对象。
- >严格键入的阵列和集合具有多个优点。它们在一个地方提供了简单的类型验证,确保在构造时始终对值进行验证,允许每个集合添加自定义逻辑,并减少在方法签名中混合参数的几率。 >可以添加方法以促进初始构造后的收集和价值对象的值进行编辑,但是在需要进行更改时,将它们保持不变并将其转换为原始类型是更有效的。进行更改后,可以使用更新的值重建集合或值对象,然后将再次验证。
- >
- 这篇文章首先出现在媒介上,并在作者的许可下重新发布。我们鼓励您在Medium上关注Bert,并在那里给他一些喜欢!
我很少提到的东西是,可以将此功能与类型提示结合起来,从而基本上创建了键入的数组。> 例如,我们可以拥有一个电影类,其中一个方法可以设置一个仅接受dateTimeImmutable对象的空气日期。
我们现在可以将可变数量的单独的dateTimeImmutable对象传递给setairdates()方法:
如果我们要通过dateTimeImmutable以外的其他内容,例如,将丢弃致命错误:
>
<span><span><?php </span></span><span> </span><span><span>class Movie { </span></span><span> <span>private $dates = []; </span></span><span> </span><span> <span>public function setAirDates(\DateTimeImmutable ...$dates) { </span></span><span> <span>$this->dates = $dates; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getAirDates() { </span></span><span> <span>return $this->dates; </span></span><span> <span>} </span></span><span><span>} </span></span>
>数组包含一个不是预期类型的值,我们仍然会遇到前面提到的致命错误。
>此外,我们可以从php 7开始使用标量类型。
再次,这可以确保评级属性将始终包含浮子,而无需我们在所有内容上循环以验证它们。因此,现在我们可以在getaveragerating()中轻松地对它们进行一些数学操作,而不必担心无效的类型。<span><span><?php </span></span><span> </span><span><span>class Movie { </span></span><span> <span>private $dates = []; </span></span><span> </span><span> <span>public function setAirDates(\DateTimeImmutable ...$dates) { </span></span><span> <span>$this->dates = $dates; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getAirDates() { </span></span><span> <span>return $this->dates; </span></span><span> <span>} </span></span><span><span>} </span></span>
>使用此功能作为键入数组的缺点之一是,我们只能定义每个方法的一个这样的数组。假设我们希望有一个电影类,该班级期望空气日期列表以及构造函数中的评分列表,而不是以后通过可选方法设置它们。上面使用的方法是不可能的。
>
>另一个问题是,当使用PHP 7时,我们的get()方法的返回类型仍然必须是“数组”,这通常太通用了。>
解决方案:集合类要解决这两个问题,我们可以简单地将我们的键入数组注入所谓的“收集”类中。这也改善了我们的关注点,因为我们现在可以将平均评级的计算方法移至相关集合类别:
>请注意,我们仍在使用构造函数中具有可变长度的键入参数列表,这为我们节省了在每个评分上循环以检查其类型的麻烦。
如果我们希望能够在foreach循环中使用此集合类,我们只需要实现iteratorAggregate界面:
<span><span><?php </span></span><span> </span><span><span>$movie = new Movie(); </span></span><span> </span><span><span>$movie->setAirDates( </span></span><span> <span><span>\DateTimeImmutable</span>::createFromFormat('Y-m-d', '2017-01-28'), </span></span><span> <span><span>\DateTimeImmutable</span>::createFromFormat('Y-m-d', '2017-02-22') </span></span><span><span>); </span></span>
在电影类中将所有难题的所有部分都放在一起,我们现在可以在构造函数中注入两个单独键入的集合。此外,我们可以在GET方法上定义比“数组”更具体的返回类型:
使用自定义验证的值对象
<span><span><?php </span></span><span> </span><span><span>$dates = [ </span></span><span> <span><span>\DateTimeImmutable</span>::createFromFormat('Y-m-d', '2017-01-28'), </span></span><span> <span><span>\DateTimeImmutable</span>::createFromFormat('Y-m-d', '2017-02-22'), </span></span><span><span>]; </span></span><span> </span><span><span>$movie = new Movie(); </span></span><span><span>$movie->setAirDates(...$dates); </span></span>
>回到我们的评分收集类中,我们只需要进行一些较小的更改即
<span><span><?php </span></span><span> </span><span><span>declare(strict_types=1); </span></span><span> </span><span><span>class Movie { </span></span><span> <span>private $dates = []; </span></span><span> <span>private $ratings = []; </span></span><span> </span><span> <span>public function setAirDates(\DateTimeImmutable ...$dates) { /* ... */ } </span></span><span> <span>public function getAirDates() : array { /* ... */ } </span></span><span> </span><span> <span>public function setRatings(float ...$ratings) { </span></span><span> <span>$this->ratings = $ratings; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getAverageRating() : float { </span></span><span> <span>if (empty($this->ratings)) { </span></span><span> <span>return 0; </span></span><span> <span>} </span></span><span> </span><span> <span>$total = 0; </span></span><span> </span><span> <span>foreach ($this->ratings as $rating) { </span></span><span> <span>$total += $rating; </span></span><span> <span>} </span></span><span> </span><span> <span>return $total / count($this->ratings); </span></span><span> <span>} </span></span><span><span>} </span></span>
这样,我们将获得对单个收集成员的其他验证,但仍然不必循环每个注入的对象。
<span><span><?php </span></span><span> </span><span><span>declare(strict_types=1); </span></span><span> </span><span><span>class Ratings { </span></span><span> <span>private $ratings; </span></span><span> </span><span> <span>public function __construct(float ...$ratings) { </span></span><span> <span>$this->ratings = $ratings; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getAverage() : float { </span></span><span> <span>if (empty($this->ratings)) { </span></span><span> <span>return 0; </span></span><span> <span>} </span></span><span> </span><span> <span>$total = 0; </span></span><span> </span><span> <span>foreach ($this->ratings as $rating) { </span></span><span> <span>$total += $rating; </span></span><span> <span>} </span></span><span> </span><span> <span>return $total / count($this->ratings); </span></span><span> <span>} </span></span><span><span>} </span></span>
键入这些单独的收集类和值对象似乎很重要,但是它们比通用数组和标量值具有多个优点:
>
<span><span><?php </span></span><span> </span><span><span>declare(strict_types=1); </span></span><span> </span><span><span>class Ratings implements IteratorAggregate { </span></span><span> <span>private $ratings; </span></span><span> </span><span> <span>public function __construct(float ...$ratings) { </span></span><span> <span>$this->ratings = $ratings; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getAverage() : float { /* ... */ } </span></span><span> </span><span> <span>public function getIterator() { </span></span><span> <span>return new ArrayIterator($this->ratings); </span></span><span> <span>} </span></span><span><span>} </span></span>
在一个地方轻松类型验证。我们永远不必手动循环浏览一个数组来验证我们的收集成员的类型; >
>
到目前
>可选的是,我们可以使我们的集合最终取得最终成绩,以防止任何儿童类都以可以消除我们的类型验证的方式弄乱了属性。
>
>幸运的是,正在进行一些RFC,可以在以后的版本中实现这两个功能,因此手指交叉了! ?
>
>
>中创建严格键入的数组和收藏
>如何执行PHP? 我可以在PHP中创建一个严格键入的对象数组? PHP中的对象通过创建一个类型的类,该类可以在添加到数组中添加的对象上检查。该类将具有添加和检索对象的方法,并且这些方法在执行操作之前会检查对象的类型。 在PHP中使用严格键入数组时,您可以使用try-catch块来处理错误。如果将元素添加到数组时发生错误(例如,如果元素是错误的类型),则将抛出异常。您可以捕获此例外并适当处理。 >
这样,我们也可以重新使用现有数组功能,例如array_filter()。<span><span><?php
</span></span><span>
</span><span><span>class Movie {
</span></span><span> <span>private $dates = [];
</span></span><span>
</span><span> <span>public function setAirDates(\DateTimeImmutable ...$dates) {
</span></span><span> <span>$this->dates = $dates;
</span></span><span> <span>}
</span></span><span>
</span><span> <span>public function getAirDates() {
</span></span><span> <span>return $this->dates;
</span></span><span> <span>}
</span></span><span><span>}
</span></span>
<span><span><?php
</span></span><span>
</span><span><span>class Movie {
</span></span><span> <span>private $dates = [];
</span></span><span>
</span><span> <span>public function setAirDates(\DateTimeImmutable ...$dates) {
</span></span><span> <span>$this->dates = $dates;
</span></span><span> <span>}
</span></span><span>
</span><span> <span>public function getAirDates() {
</span></span><span> <span>return $this->dates;
</span></span><span> <span>}
</span></span><span><span>}
</span></span>
>虽然远非完美,但它稳步地使用php的最新发行版中的集合和价值对象中的类型验证变得越来越容易。 generics:https://wiki.php.net/rfc/generics
>如果您发现本教程有帮助,请访问Medium上的原始帖子,并给它一些❤️。如果您有任何反馈,疑问或评论,请在下面或原始帖子上留下回答。
经常询问的问题(常见问题解答)有关在PHP中的数组使用类型提示,是的,PHP支持对数组的类型提示。您可以通过在函数或方法声明中的参数名称之前添加“数组”来指定函数或方法将数组作为参数的期望。但是,这仅确保参数是数组,而不是数组中的所有元素均为特定类型。
>松散键入和严格键入的数组之间有什么区别?在严格键入的数组中,所有元素必须是特定类型的。如果您尝试在严格键入的数组中添加其他类型的元素,则将丢弃错误。
>>您可以强制执行检查中的检查PHP通过使用“声明(strict_types = 1);”;指令在您的PHP文件开始时。这将强制执行严格的类型检查文件中的所有函数调用和返回语句。
php?
的严格键入数组的局限性是什么? PHP中严格键入数组的主要限制是它们需要其他代码才能实现,因为PHP并未在本地支持它们。这可以使您的代码更加复杂和难以维护。此外,严格键入的数组可以比松散键入的数组更灵活,因为它们不允许使用不同类型的元素。
我可以使用php?
的多维数组的类型提示,是的,是的。您可以使用PHP中的多维阵列使用类型提示。但是,PHP的类型暗示仅确保参数是一个数组,而不是数组(或子阵列)中的所有元素均为特定类型。 php?
我可以使用具有PHP的内置数组函数的严格键入数组吗?
是的,您可以使用PHP的内置阵列使用严格键入的数组功能。但是,您需要小心,因为这些功能不会强制执行检查。如果您使用修改数组的函数并添加错误类型的元素,则可能会导致错误。
以上是在PHP中创建严格键入的数组和收集的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...
