欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          帶你聊聊PHP中的泛型之基礎(chǔ)知識淺析

          本篇文章帶大家聊聊PHP中的泛型,先了解一下php泛型的基礎(chǔ)知識,在之后的文章中會帶大家深入了解泛型,希望對大家有所幫助!

          帶你聊聊PHP中的泛型之基礎(chǔ)知識淺析

          PHP 中的泛型。我知道我想要的就是這個。我知道很多開發(fā)者都想要這個使用這個類型。另一方面,也可能有很大規(guī)模的一群 PHP 程序員,不知道泛型是什么,或者認為他們?yōu)槭裁匆羞@個類型。

          我將在這個博客上做一個關(guān)于泛型和 PHP 的系列文章。讓我們從頭開始,很快我們就會找到更復雜的話題。我們將討論什么是泛型,為什么 PHP 不支持它們,未來可能發(fā)生什么。

          讓我們開始吧。

          帶你聊聊PHP中的泛型之基礎(chǔ)知識淺析

          每種編程語言都有某種類型的系統(tǒng)。有些語言的實現(xiàn)非常嚴格,而其他語言 ——PHP 屬于這一類 —— 則要寬松得多

          現(xiàn)在,使用類型系統(tǒng)的原因有很多。 最明顯的是類型驗證。

          假設(shè)我們有一個接受兩個數(shù)字、兩個整數(shù)的函數(shù); 并對它們進行一些數(shù)學運算:

          function add($a, $b)  {     return $a + $b; }

          PHP 允許您將任何類型的數(shù)據(jù)傳遞給該函數(shù),數(shù)字、字符串、布爾值都無所謂。 PHP 將盡最大努力在有意義的時候轉(zhuǎn)換變量,例如將它們加在一起。

          add('1', '2');

          但是這些轉(zhuǎn)換 —— 類型雜耍 —— 通常會導致意想不到的結(jié)果,或者說是:錯誤和崩潰。

          add([], true); // ?

          現(xiàn)在,我們可以手動編寫代碼來檢查我們的數(shù)學加法運算,它將被用于任何給定的輸入

          function add($a, $b)  {     if (!is_int($a) || !is_int($b)) {         return null;     }      return $a + $b; }

          或者,我們可以使用 PHPS 內(nèi)置類型提示–這是我們手動執(zhí)行操作的內(nèi)置簡寫:

          function add(int $a, int $b): int  {     return $a + $b; }

          PHP 社區(qū)中的許多開發(fā)人員說他們并不真正關(guān)心這些類型提示,因為他們知道自己應(yīng)該只將整數(shù)傳遞給這個函數(shù) – 畢竟是他們自己寫的。

          然而,這種推理很快就會瓦解:您通常不是唯一一個在該代碼庫中工作的人,您還在使用不是您自己編寫的代碼 – 想想您用 Composer 引入了多少包。因此,雖然這個孤立的示例看起來不是什么大問題,但是一旦您的代碼開始增長,類型檢查確實會派上用場。

          除此之外,添加類型提示不僅可以防止無效狀態(tài),而且還澄清我們程序員需要什么樣類型的值輸入。定義好類型后通常使您無需閱讀外部文檔,因為函數(shù)的大部分功能已經(jīng)被其類型定義封裝。

          IDE 大量使用了這一原則:它們可以告訴程序員函數(shù)期望什么樣類型的值的輸入,或者對象上有哪些字段和方法可用 —— 因為它屬于一個類。IDE 使我們的代碼編寫效率更高,這在很大程度上是因為它們可以靜態(tài)分析我們代碼庫中的類型提示。

          記住這個詞:靜態(tài)分析 —— 這在本系列的后面會非常重要。 這意味著程序、IDE 或其他類型的「靜態(tài)分析器」可以查看我們的代碼,并且在不運行它的情況下告訴我們它是否會工作 —— 至少在某種程度上是這樣。如果我們將一個字符串傳遞給我們的只接受整數(shù)的函數(shù),我們的 IDE 會告訴我們我們做錯了什么 —— 這會導致程序在運行時崩潰;但我們的 IDE 無需實際運行代碼就能告訴我們。

          另一方面,類型系統(tǒng)也有其局限性。 一個常見的例子是「項目列表」:

          class Collection extends ArrayObject {     public function offsetGet(mixed $key): mixed      { /* … */ }      public function filter(Closure $fn): self      { /* … */ }      public function map(Closure $fn): self      { /* … */ } }

          一個集合有很多方法可以處理任何類型的輸入:循環(huán)、過濾、映射,等等;集合實現(xiàn)不應(yīng)該關(guān)心它是處理字符串還是整數(shù)。

          但是,讓我們從局外人的角度來看。如果我們想確保一個集合只包含字符串,而另一個集合只包含「用戶」對象,會發(fā)生什么。集合本身在循環(huán)其 items 時并不關(guān)心,但我們關(guān)心。我們想知道循環(huán)中的這個項目是用戶還是字符串 —— 這是完全不同的。但是如果沒有正確的類型信息,我們的 IDE 就會在未知情況中運行。

          $users = new Collection();  // …  foreach ($users as $user) {     $user-> // ? }

          現(xiàn)在,我們可以為每個集合創(chuàng)建單獨的實現(xiàn):一個只適用于字符串的實現(xiàn),另一個只適用于 User 對象:

          class StringCollection extends Collection {     public function offsetGet(mixed $key): string      { /* … */ } }  class UserCollection extends Collection {     public function offsetGet(mixed $key): User      { /* … */ } }

          但是如果我們需要第三個實現(xiàn)?第四個?也許 10 個或 20 個。管理這些代碼將會變得非常困難。

          這就是泛型的用武之地。

          需要澄清的是:PHP 沒有泛型。這是一個大膽的聲明,走了不少彎路,我們將在本系列的后面部分討論這一點。但是現(xiàn)在我可以說我接下來要展示的內(nèi)容在 PHP 中是沒有的。 但是它存在于其他編程語言中。

          許多編程語言允許開發(fā)人員在集合類上定義 “泛型”,而不是為每個可能的類型去單獨實現(xiàn):

          class Collection<Type> extends ArrayObject {     public function offsetGet(mixed $key): Type      { /* … */ }      // … }

          基本上我們說的是集合類的實現(xiàn)適用于任何類型的輸入,但是當我們創(chuàng)建集合的實例時,我們應(yīng)該指定一個類型。它是一個泛型實現(xiàn),需要根據(jù)程序員的需求來特定:

          $users = new Collection<User>();  $slugs = new Collection<string>();

          添加類型似乎是一件小事。但這種類型本身就開啟了一個充滿可能性的世界。 我們的 IDE 現(xiàn)在知道了集合中的數(shù)據(jù)類型,它可以告訴我們是否添加了錯誤類型的項;它可以告訴我們在迭代集合時可以對項執(zhí)行什么操作;它可以告訴我們是否將集合傳遞給知道如何處理這些特定項的函數(shù)。

          雖然我們可以通過手動為我們需要的每種類型實現(xiàn)一個集合,在技術(shù)上實現(xiàn)同樣的效果;對于編寫和維護代碼的開發(fā)人員來說,通用實現(xiàn)將是一項重大改進。

          那么,我們?yōu)槭裁床辉?PHP 中使用泛型呢?除了無聊的收藏,我們還能用它們做什么?我們能為他們增加支持嗎?我們將在這個系列中回答所有這些問題。首先需要澄清的是:我在本系列文章中的目標是教你關(guān)于泛型的知識,但同樣重要的是,我想讓大家意識到我們是如何誤解 PHP 的。我想改變這種狀況。

          英文原文地址:https://stitcher.io/blog/generics-in-php-1

          推薦:《PHP視頻教程》

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號