亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    PHP中數(shù)組規(guī)范和自定義集合

    PHP中數(shù)組規(guī)范和自定義集合

    這差不多是一個(gè)關(guān)于數(shù)組設(shè)計(jì)的風(fēng)格指南,但是把它添加到對(duì)象設(shè)計(jì)風(fēng)格指南感覺不太對(duì),因?yàn)椴皇撬械拿嫦驅(qū)ο笳Z(yǔ)言都有動(dòng)態(tài)數(shù)組。本文中的示例是用 PHP 編寫的,因?yàn)?PHP 很像 Java(可能比較熟悉),但是使用的是動(dòng)態(tài)數(shù)組而不是內(nèi)置的集合類和接口。

    使用數(shù)組作為列表

    所有元素都應(yīng)該具有相同的類型

    當(dāng)使用一個(gè)數(shù)組作為一個(gè)列表(一個(gè)具有特定順序的值的集合)時(shí),每個(gè)值應(yīng)該是 z 類型:

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

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

    應(yīng)該忽略每個(gè)元素的索引

    PHP 將自動(dòng)為列表中的每個(gè)元素(0、1、2等)創(chuàng)建新索引。然而,你不應(yīng)該依賴這些索引,也不應(yīng)該直接使用它們??蛻舳藨?yīng)該依賴的列表的唯一屬性是可迭代的可計(jì)數(shù)的。

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

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

    (在 PHP 中,for循環(huán)甚至可能不起作用,因?yàn)榱斜碇锌赡苋鄙偎饕?,而且索引可能比列表中的元素?cái)?shù)量還要多。)

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

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

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

    // 好的過濾: 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 );  // 不好的過濾器(同時(shí)使用索引和元素來過濾元素) array_filter(     $list,      function (string $element, int $index): bool {          return $index > 3 || $element === 'Include';     },     ARRAY_FILTER_USE_BOTH );

    使用數(shù)組作為映射

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

    所有的鍵應(yīng)該是相同的類型

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

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

    所有的值都應(yīng)該是相同的類型

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

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

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

    映射應(yīng)該保持私有

    列表可以安全地在對(duì)象之間傳遞,因?yàn)樗鼈兙哂泻?jiǎn)單的特征。任何客戶端都可以使用它來循環(huán)其元素,或計(jì)數(shù)其元素,即使列表是空的。映射則更難處理,因?yàn)榭蛻舳丝赡芤蕾囉跊]有對(duì)應(yīng)值的鍵。這意味著在一般情況下,它們應(yīng)該對(duì)管理它們的對(duì)象保持私有。不允許客戶端直接訪問內(nèi)部映射,而是提供 getter (可能還有 setter )來檢索值。如果請(qǐng)求的鍵不存在值,則拋出異常。但是,如果您可以保持映射及其值完全私有,那么就這樣做。

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

    對(duì)具有多個(gè)值類型的映射使用對(duì)象

    當(dāng)你想要在一個(gè)映射中存儲(chǔ)不同類型的值時(shí),請(qǐng)使用一個(gè)對(duì)象。定義一個(gè)類,并向其添加公共的類型化屬性,或添加構(gòu)造函數(shù)和 getter。像這樣的對(duì)象的例子是配置對(duì)象,或者命令對(duì)象:

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

    這些規(guī)則的例外

    有時(shí),庫(kù)或框架需要以更動(dòng)態(tài)的方式使用數(shù)組。在這些情況下,不可能(也不希望)遵循前面的規(guī)則。例如數(shù)組數(shù)據(jù),它將被存儲(chǔ)在一個(gè)數(shù)據(jù)庫(kù)表中,或者Symfony 表單配置。

    自定義集合類

    自定義集合類是一種非??岬姆椒ǎ詈罂梢院?code>Iterator、ArrayAccess和其朋友一起使用,但是我發(fā)現(xiàn)大多數(shù)生成的代碼令人很困惑。第一次查看代碼的人必須在 PHP 手冊(cè)中查找詳細(xì)信息,即使他們是有經(jīng)驗(yàn)的開發(fā)人員。另外,你需要編寫

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)