您好,登錄后才能下訂單哦!
這篇文章主要介紹“PHP中的泛型使用實例分析”,在日常操作中,相信很多人在PHP中的泛型使用實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”PHP中的泛型使用實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
泛型示例
$users = new Collection<User>(); $slugs = new Collection<string>();
集合
它們可能是解釋泛型的最簡單方法,但它們也是每個人在討論泛型時都會談論的示例。人們通常認為「泛型」和「具有類型的集合」是一回事。絕對不是這樣。
所以讓我們再看兩個例子。
這是一個名為「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中的泛型使用實例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。