中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP中泛型的基礎知識有哪些

發布時間:2022-04-06 11:04:10 來源:億速云 閱讀:155 作者:iii 欄目:編程語言

這篇“PHP中泛型的基礎知識有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“PHP中泛型的基礎知識有哪些”文章吧。

PHP中泛型的基礎知識有哪些

PHP 中的泛型。我知道我想要的就是這個。我知道很多開發者都想要這個使用這個類型。另一方面,也可能有很大規模的一群 PHP 程序員,不知道泛型是什么,或者認為他們為什么要有這個類型。

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

讓我們開始吧。

PHP中泛型的基礎知識有哪些

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

現在,使用類型系統的原因有很多。 最明顯的是類型驗證。

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

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

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

add('1', '2');

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

add([], true); // ?

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

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

    return $a + $b;
}

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

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

PHP 社區中的許多開發人員說他們并不真正關心這些類型提示,因為他們知道自己應該只將整數傳遞給這個函數 - 畢竟是他們自己寫的。

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

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

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

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

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

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

    public function filter(Closure $fn): self 
    { /* … */ }

    public function map(Closure $fn): self 
    { /* … */ }
}

一個集合有很多方法可以處理任何類型的輸入:循環、過濾、映射,等等;集合實現不應該關心它是處理字符串還是整數。

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

$users = new Collection();

// …

foreach ($users as $user) {
    $user-> // ?
}

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

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

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

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

這就是泛型的用武之地。

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

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

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

    // …
}

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

$users = new Collection<User>();

$slugs = new Collection<string>();

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

以上就是關于“PHP中泛型的基礎知識有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

云龙县| 拜城县| 禹城市| 尚志市| 微博| 名山县| 鹰潭市| 台东市| 万盛区| 抚宁县| 宁国市| 白朗县| 历史| 永顺县| 开江县| 盱眙县| 隆回县| 孝昌县| 宜昌市| 广饶县| 灵宝市| 三门县| 尤溪县| 磐石市| 承德市| 贵德县| 平乐县| 宜丰县| 左云县| 玛多县| 泗水县| 滦南县| 新密市| 千阳县| 西充县| 嵊州市| 理塘县| 大城县| 双牌县| 芷江| 龙岩市|