日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
帶你聊聊PHP中的泛型之基礎(chǔ)知識(shí)淺析

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

成都創(chuàng)新互聯(lián)專注于望江網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供望江營(yíng)銷型網(wǎng)站建設(shè),望江網(wǎng)站制作、望江網(wǎng)頁(yè)設(shè)計(jì)、望江網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造望江網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供望江網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

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

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

讓我們開始吧。

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

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

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

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

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

add('1', '2');

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

add([], true); // ?

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

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

    return $a + $b;
}

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

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

PHP 社區(qū)中的許多開發(fā)人員說他們并不真正關(guān)心這些類型提示,因?yàn)樗麄冎雷约簯?yīng)該只將整數(shù)傳遞給這個(gè)函數(shù) - 畢竟是他們自己寫的。

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

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

IDE 大量使用了這一原則:它們可以告訴程序員函數(shù)期望什么樣類型的值的輸入,或者對(duì)象上有哪些字段和方法可用 —— 因?yàn)樗鼘儆谝粋€(gè)類。IDE 使我們的代碼編寫效率更高,這在很大程度上是因?yàn)樗鼈兛梢造o態(tài)分析我們代碼庫(kù)中的類型提示。

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

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

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

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

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

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

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

$users = new Collection();

// …

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

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

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

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

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

這就是泛型的用武之地。

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

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

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

    // …
}

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

$users = new Collection();

$slugs = new Collection();

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

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

那么,我們?yōu)槭裁床辉?PHP 中使用泛型呢?除了無(wú)聊的收藏,我們還能用它們做什么?我們能為他們?cè)黾又С謫幔课覀儗⒃谶@個(gè)系列中回答所有這些問題。首先需要澄清的是:我在本系列文章中的目標(biāo)是教你關(guān)于泛型的知識(shí),但同樣重要的是,我想讓大家意識(shí)到我們是如何誤解 PHP 的。我想改變這種狀況。


分享文章:帶你聊聊PHP中的泛型之基礎(chǔ)知識(shí)淺析
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/dpehjge.html