站長資訊網
        最全最豐富的資訊網站

        PHP中數組規范和自定義集合

        PHP中數組規范和自定義集合

        這差不多是一個關于數組設計的風格指南,但是把它添加到對象設計風格指南感覺不太對,因為不是所有的面向對象語言都有動態數組。本文中的示例是用 PHP 編寫的,因為 PHP 很像 Java(可能比較熟悉),但是使用的是動態數組而不是內置的集合類和接口。

        使用數組作為列表

        所有元素都應該具有相同的類型

        當使用一個數組作為一個列表(一個具有特定順序的值的集合)時,每個值應該是 z 類型:

        $goodList = [     'a',     'b' ];  $badList = [     'a',     1 ];

        一個被普遍接受的注釋列表類型的風格是:@var array<TypeOfElement>。 確保不添加索引的類型(它總是int)。

        應該忽略每個元素的索引

        PHP 將自動為列表中的每個元素(0、1、2等)創建新索引。然而,你不應該依賴這些索引,也不應該直接使用它們。客戶端應該依賴的列表的唯一屬性是可迭代的可計數的

        因此,可以隨意使用foreachcount(),但不要使用for循環遍歷列表中的元素:

        // 好的循環: foreach ($list as $element) { }  // 不好的循環 (公開每個元素的索引): foreach ($list as $index => $element) { }  // 也是不好的循環 (不應該使用每個元素的索引): for ($i = 0; $i < count($list); $i++) { }

        (在 PHP 中,for循環甚至可能不起作用,因為列表中可能缺少索引,而且索引可能比列表中的元素數量還要多。)

        使用過濾器而不是刪除元素

        你可能希望通過索引從列表中刪除元素(unset()),但是,你應該使用array_filter()來創建一個新列表(沒有不需要的元素),而不是刪除元素。

        同樣,你不應該依賴于元素的索引,因此,在使用array_filter()時,不應該使用flag 參數去根據索引過濾元素,甚至根據元素和索引過濾元素。

        // 好的過濾: array_filter(     $list,      function (string $element): bool {          return strlen($element) > 2;      } );  // 不好的過濾器(也使用索引來過濾元素) array_filter(     $list,      function (int $index): bool {          return $index > 3;     },     ARRAY_FILTER_USE_KEY );  // 不好的過濾器(同時使用索引和元素來過濾元素) array_filter(     $list,      function (string $element, int $index): bool {          return $index > 3 || $element === 'Include';     },     ARRAY_FILTER_USE_BOTH );

        使用數組作為映射

        當鍵相關的,而不是索引(0,1,2,等等)。你可以隨意使用數組作為映射(可以通過其唯一的鍵從其中檢索值)。

        所有的鍵應該是相同的類型

        使用數組作為映射的第一個規則是,數組中的所有鍵都應該具有相同的類型(最常見的是string類型的鍵)。

        $goodMap = [     'foo' => 'bar',     'bar' => 'baz' ];  // 不好(使用不同類型的鍵) $badMap = [     'foo' => 'bar',     1 => 'baz' ];

        所有的值都應該是相同的類型

        映射中的值也是如此:它們應該具有相同的類型。

        $goodMap = [     'foo' => 'bar',     'bar' => 'baz' ];  // 不好(使用不同類型的值) $badMap = [     'foo' => 'bar',     'bar' => 1 ];

        一種普遍接受的映射類型注釋樣式是: @var array<TypeOfKey, TypeOfValue>

        映射應該保持私有

        列表可以安全地在對象之間傳遞,因為它們具有簡單的特征。任何客戶端都可以使用它來循環其元素,或計數其元素,即使列表是空的。映射則更難處理,因為客戶端可能依賴于沒有對應值的鍵。這意味著在一般情況下,它們應該對管理它們的對象保持私有。不允許客戶端直接訪問內部映射,而是提供 getter (可能還有 setter )來檢索值。如果請求的鍵不存在值,則拋出異常。但是,如果您可以保持映射及其值完全私有,那么就這樣做。

        // 公開一個列表是可以的  /**  * @return array<User>  */ public function allUsers(): array {     // ... }  // 公開地圖可能很麻煩  /**  * @return array<string, User>  */ public function usersById(): array {      // ... }  // 相反,提供一種方法來根據其鍵檢索值  /**  * @throws UserNotFound  */  public function userById(string $id): User {      // ... }

        對具有多個值類型的映射使用對象

        當你想要在一個映射中存儲不同類型的值時,請使用一個對象。定義一個類,并向其添加公共的類型化屬性,或添加構造函數和 getter。像這樣的對象的例子是配置對象,或者命令對象:

        final class SillyRegisterUserCommand {     public string $username;     public string $plainTextPassword;     public bool $wantsToReceiveSpam;     public int $answerToIAmNotARobotQuestion; }

        這些規則的例外

        有時,庫或框架需要以更動態的方式使用數組。在這些情況下,不可能(也不希望)遵循前面的規則。例如數組數據,它將被存儲在一個數據庫表中,或者Symfony 表單配置。

        自定義集合類

        自定義集合類是一種非常酷的方法,最后可以和IteratorArrayAccess和其朋友一起使用,但是我發現大多數生成的代碼令人很困惑。第一次查看代碼的人必須在 PHP 手冊中查找詳細信息,即使他們是有經驗的開發人員。另外,你需要編寫

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国内精品国语自产拍在线观看| 乱人伦人妻精品一区二区| 亚洲国产精品久久66| 在线精品无码字幕无码AV| 伊人久久大香线蕉精品| 亚洲国产精品嫩草影院在线观看| 国产成人精品免高潮在线观看| 精品偷自拍另类在线观看| 日韩精品毛片| 国产这里有精品| 亚洲国产精品成| 国产精品视频网站| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 亚洲αv在线精品糸列| 九九久久精品国产| 国产精品99| 91久久精品无码一区二区毛片| 国产精品一区二区久久| 99热门精品一区二区三区无码| 久久精品国产亚洲AV麻豆网站| 亚洲2022国产成人精品无码区 | 夜夜爽一区二区三区精品| 国产亚洲精品看片在线观看| 97国产视频精品| 日本精品久久久中文字幕| 国产成人精品精品欧美| 97久久精品无码一区二区| 国产精品99久久99久久久| 无码精品A∨在线观看| 亚洲精品无码精品mV在线观看| 无码精品第一页| 亚洲日韩欧美制服精品二区| 亚洲精品成人片在线观看| 人妻少妇看A偷人无码精品| 无码精品第一页| 亚洲精品国产精品乱码不99| 亚洲AV日韩精品久久久久| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 乱精品一区字幕二区| 日韩AV无码精品人妻系列| 久久久免费精品re6|