内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

PHP中的泛型使用實例分析

這篇文章主要介紹“PHP中的泛型使用實例分析”,在日常操作中,相信很多人在PHP中的泛型使用實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP中的泛型使用實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)是一家專業(yè)提供根河企業(yè)網(wǎng)站建設,專注與網(wǎng)站建設、成都網(wǎng)站建設、H5開發(fā)、小程序制作等業(yè)務。10年已為根河眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進行中。

PHP中的泛型使用實例分析

深入泛型

泛型示例

$users = new Collection<User>();

$slugs = new Collection<string>();

集合 它們可能是解釋泛型的最簡單方法,但它們也是每個人在討論泛型時都會談論的示例。人們通常認為「泛型」和「具有類型的集合」是一回事。絕對不是這樣。

所以讓我們再看兩個例子。

PHP中的泛型使用實例分析

這是一個名為「app」的函數(shù)——如果你使用像 Laravel 這樣的框架,它可能看起來很熟悉:這個函數(shù)接受一個類名,并使用依賴容器解析該類的一個實例:

function app(string $className): mixed
{
    return Container::get($className);
}

現(xiàn)在,你不需要知道容器是如何工作的,重要的是這個函數(shù)會給你一個你請求的類的實例。

所以,基本上,它是一個通用函數(shù);一個返回類型取決于你給它的類名。如果我們的 IDE 和其他靜態(tài)分析器也明白,如果我給這個函數(shù)提供類名「UserRepository」,我希望返回一個 UserRepository 的實例,而不是別的,那就太酷了:

function app(string $className): mixed
{ /* … */ }

app(UserRepository::class); // ?

好吧,泛型允許我們這樣做。

我想現(xiàn)在是提一下我一直保守秘密的好時機,就像: 我在 上一篇 中提到 PHP 中不存在泛型;好吧,這并不完全正確。那里的所有靜態(tài)分析器——無需運行即可讀取代碼的工具,像你的 IDE 之類的工具——他們允許將 doc 塊注釋用于泛型:

/**
 * @template Type
 * @param class-string<Type> $className
 * @return Type
 */
function app(string $className): mixed
{ /* … */ }

誠然:這不是最完美的語法,所有靜態(tài)分析器都依賴于一個簡單的協(xié)議,即這是沒有官方規(guī)范語法; 但是:它有效。PHP 世界中最大的三個靜態(tài)分析器:PhpStorm、Psalm 和 PhpStan,都在一定程度上理解這種語法。

像 PhpStorm 這樣的 IDE 使用它,以便在程序員編寫代碼時向他們提供反饋,而像 Psalm 和 PhpStan 這樣的工具使用它,來批量分析你的代碼庫并檢測潛在的 bug,主要基于類型定義。

所以實際上,我們可以構建這個 app 函數(shù),使我們的工具不再在黑暗中運行。 當然,PHP 本身并不能保證返回類型是正確的,因為 PHP 不會在運行時對該函數(shù)進行類型檢查; 但是,如果我們可以相信我們的靜態(tài)分析器是正確的,那么在運行它時,這段代碼就很少——甚至沒有機會被中斷。

這就是靜態(tài)分析令人難以置信的力量:實際上,我們可以確定,無需運行我們的代碼; 其中大部分將按預期工作。 所有這一切都歸功于類型——包括泛型。

讓我們來看一個更復雜的例子:

Attributes::in(MyController::class)
    ->filter(RouteAttribute::class)
    ->newInstance()
    ->

在這里,我們有一個可以“查詢”屬性并即時實例化它們的類。 如果你在知道它們的反射 API 相當冗長之前使用過屬性,那么我發(fā)現(xiàn)這種輔助類非常有用。

當我們使用 filter 方法時,我們給它一個屬性的類名; 然后調(diào)用 newInstance 方法,我們知道結果將是我們過濾類的一個實例。 再說一遍:如果我們的 IDE 能理解我們在說什么,那就太好了。

你猜對了:泛型允許我們這樣做:

/** @template AttributeType */
class Attributes
{
    /**
     * @template InputType
     * @param class-string<InputType> $className
     * @return self<InputType>
     */
    public function filter(string $className): self
    { /* … */ }

    /**
     * @return AttributeType 
     */   
    public function newInstance(): mixed
    { /* … */ }

    // …
}

到此,關于“PHP中的泛型使用實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

文章題目:PHP中的泛型使用實例分析
鏈接URL:http://m.rwnh.cn/article18/jcjdgp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、域名注冊、網(wǎng)站維護、服務器托管、響應式網(wǎng)站、云服務器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
嘉黎县| 阳山县| 开江县| 宣城市| 甘洛县| 安多县| 策勒县| 松溪县| 哈尔滨市| 当雄县| 团风县| 冀州市| 莱西市| 清苑县| 铜川市| 安徽省| 芷江| 理塘县| 娄烦县| 辉南县| 水富县| 潼南县| 汤原县| 和顺县| 东兴市| 阜城县| 广州市| 常熟市| 肃北| 浑源县| 巴中市| 京山县| 内丘县| 金乡县| 特克斯县| 延安市| 赤城县| 巍山| 南华县| 航空| 丽江市|