我很少提到的东西是,可以将此功能与类型提示结合起来,从而基本上创建了键入的数组。> 例如,我们可以拥有一个电影类,其中一个方法可以设置一个仅接受dateTimeImmutable对象的空气日期。
如果我们要通过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>
>使用此功能作为键入数组的缺点之一是,我们只能定义每个方法的一个这样的数组。假设我们希望有一个电影类,该班级期望空气日期列表以及构造函数中的评分列表,而不是以后通过可选方法设置它们。上面使用的方法是不可能的。
>
解决方案:集合类要解决这两个问题,我们可以简单地将我们的键入数组注入所谓的“收集”类中。这也改善了我们的关注点,因为我们现在可以将平均评级的计算方法移至相关集合类别:
如果我们希望能够在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中文网其他相关文章!