91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

PHP中的泛型使用實例分析

發布時間:2022-04-12 13:51:45 來源:億速云 閱讀:228 作者:zzz 欄目:編程語言

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

PHP中的泛型使用實例分析

深入泛型

泛型示例

$users = new Collection<User>();

$slugs = new Collection<string>();

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

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

PHP中的泛型使用實例分析

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

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

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

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

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

app(UserRepository::class); // ?

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

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

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

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

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

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

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

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

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

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

當我們使用 filter 方法時,我們給它一個屬性的類名; 然后調用 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中的泛型使用實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

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

php
AI

舟山市| 奉节县| 保定市| 旺苍县| 天等县| 新龙县| 崇左市| 高邮市| 彝良县| 逊克县| 娄底市| 衡水市| 桃江县| 舟曲县| 高尔夫| 翁源县| 定日县| 大化| 邮箱| 屏边| 东乡县| 凤凰县| 四会市| 浦北县| 綦江县| 县级市| 和顺县| 玉龙| 治县。| 连云港市| 古田县| 辽宁省| 陕西省| 穆棱市| 阿尔山市| 都兰县| 宁强县| 潍坊市| 且末县| 大田县| 建水县|