我很少提到的東西是,可以將此功能與類型提示結合起來,從而基本上創建了鍵入的數組。 > 例如,我們可以擁有一個電影類,其中一個方法可以設置一個僅接受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中文網其他相關文章!