亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
PHP 2024 論壇
spO0q ?? ? 10 月 13 日

PHP:單子

Nov 02, 2024 pm 09:09 PM

這篇文章的靈感很大程度上來自 Gina Banyard 在“FORUM PHP 2024”上的技術(shù)演講:

用 3 個簡單的同義詞揭開 Monad 的神秘面紗

讓我們從一些同義詞開始:

  • 容器
  • 包裝
  • 設(shè)計(jì)模式

如果你用谷歌搜索“PHP monads”,其他概念會很快出現(xiàn),比如函數(shù)式編程、綁定、堆棧,甚至深奧的數(shù)學(xué)(例如函子、幺半群)。

別害怕。

從本質(zhì)上講,Monad 是一種可以通過多種方式實(shí)現(xiàn)的模式。

設(shè)計(jì)模式

當(dāng)您要運(yùn)行一些操作時,您可以像往常一樣簡單地定義自定義對象和助手。

那么,為什么要費(fèi)心考慮替代概念呢?

恕我直言,這仍然是一個好問題,因?yàn)槟枰3中?,但?jīng)典方法存在常見的局限性:

  • 操作順序很重要
  • 濕代碼
  • 例外

Monad 可以更一致地處理可選(或尚不可用)值。

Monad 與經(jīng)典錯誤處理/異常

現(xiàn)代項(xiàng)目包含靜態(tài)分析工具,但 PHP 異常沒有類型化。

也就是說,工具無法檢測函數(shù)簽名中的異常,因此無法判斷代碼是否正確處理異常。

為了測試這一點(diǎn),開發(fā)團(tuán)隊(duì)通常會編寫功能測試,但通過靜態(tài)分析進(jìn)行早期檢測會更可靠。

來源:“Les Exception:le trou dans la raquette du typepage”(fr)

使用 Monads,您在所有情況下都會獲得一個類型化對象,例如自定義枚舉情況(例如 FileErrors::AccessDenied),因此錯誤會在系統(tǒng)中鍵入。

實(shí)現(xiàn) Logger Monad

構(gòu)建強(qiáng)大的日志系統(tǒng)可能具有挑戰(zhàn)性。復(fù)制字符串和調(diào)用很容易。

您可能會定義一個名為 log() 的自定義幫助程序,并在項(xiàng)目中的任何地方使用它,而不是對所有內(nèi)容進(jìn)行硬編碼。

這旨在保持代碼干燥,但可能不允許在特定情況下組合更復(fù)雜的函數(shù)。

函數(shù)式方法不包括使用這樣的全局幫助器。相反,它寧愿實(shí)現(xiàn)一個 Monad 來包裝其他函數(shù):

final class LoggerMonad {
    public function __construct(
        public mixed $data,
        public array $logs = [],
    ) {}

    public function bind(callable $fn) {
         $resultLoggerMonad = $fn($this->data);
         return new LoggerMonad(
             $resultLoggerMonad->data,
             [...$this->logs, ...$resultLoggerMonad->logs],
         );
   }
}

function loggify(callable $fn): Closure {
    return function ($value) use ($fn) {
        $name = (new ReflectionFunction($fn))->name;
        $log = [
            'Running '. $name .'('. var_export($value, true) .')'
        ];
        return new LoggerMonad($fn($value), $log);
    };
}

然后,您可以像這樣使用 loggify 包裝器:

function add2(int $v): int {
    return $v + 2;
}

function square(int $v): int {
    return $v * $v;
}

function multi3(int $v): int {
    return $v * 3;
}

function logIt($value, callable ...$fns) {
    $logging_fns = array_map(loggify(...), $fns);
    $monad = new LoggerMonad($value);
    foreach ($logging_fns as $fn) {
        $monad = $monad->bind($fn);
    }
    return $monad;
}

print_r(logIt(
   3,
   add2(...),
   square(...),
   multi3(...)
));

來源:“Monades simplement”,作者:Gina Banyard (fr)

什么是綁定?

??寶貝別傷害我

Monad 旨在包裝值,可以是任何類型,包括對象和函數(shù)。

與任何其他包裝系統(tǒng)一樣,您會發(fā)現(xiàn)一個將此值作為輸入的構(gòu)造函數(shù)(?類)以及一些根據(jù)您嘗試實(shí)現(xiàn)的模式有其自己用途的方法。

但是,所有 Monad 都包含綁定函數(shù)。顧名思義,這是傳遞值(或回調(diào))的地方。

無論這些回調(diào)中發(fā)生什么,monad 都會包裝它,這似乎是裝飾值和重構(gòu)代碼的強(qiáng)大方法。

代碼可讀性更好嗎?

這顯然取決于實(shí)現(xiàn),一開始很容易迷失。

但是,這種替代方法可以顯著減少 if 塊的數(shù)量,并使返回值更加一致:

final class LoggerMonad {
    public function __construct(
        public mixed $data,
        public array $logs = [],
    ) {}

    public function bind(callable $fn) {
         $resultLoggerMonad = $fn($this->data);
         return new LoggerMonad(
             $resultLoggerMonad->data,
             [...$this->logs, ...$resultLoggerMonad->logs],
         );
   }
}

function loggify(callable $fn): Closure {
    return function ($value) use ($fn) {
        $name = (new ReflectionFunction($fn))->name;
        $log = [
            'Running '. $name .'('. var_export($value, true) .')'
        ];
        return new LoggerMonad($fn($value), $log);
    };
}

來源:fp4php - monad

優(yōu)點(diǎn)和缺點(diǎn)

優(yōu)點(diǎn)

  • ? 有不同用途的各種 monad : Maybe、Either、Logger、List、Reader 等
  • ? monad 允許使用更好的類型包裝代碼,這可能會改進(jìn)靜態(tài)分析
  • ? PHP 不為此提供內(nèi)置構(gòu)造,??因此實(shí)現(xiàn)完全取決于開發(fā)人員

缺點(diǎn)

  • ? PHP 不為此提供內(nèi)置結(jié)構(gòu)(例如泛型),因此實(shí)現(xiàn)完全取決于開發(fā)人員
  • ?它并沒有簡化代碼

更進(jìn)一步

  • 使用 monad、monad 轉(zhuǎn)換器和 Cats MTL 進(jìn)行功能性錯誤處理
  • PHP 中的 Monad 和用法
  • PHP 函數(shù)式編程

包起來

希望您現(xiàn)在對 PHP monad 有更多了解。

當(dāng)然,您不應(yīng)該僅僅為了項(xiàng)目而添加花哨的設(shè)計(jì)模式。

此外,雖然這是一個全新的范例,但很容易錯過要點(diǎn)并專注于非常具體的方面,例如錯誤處理。

然而,發(fā)現(xiàn)新方法仍然令人耳目一新。我們需要跳出框框思考。

以上是PHP:單子的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

PHP變量范圍解釋了 PHP變量范圍解釋了 Jul 17, 2025 am 04:16 AM

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次并在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助于避免錯誤并提升代碼穩(wěn)定性。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗(yàn)證來源與類型、控制文件名與路徑、設(shè)置服務(wù)器限制并二次處理媒體文件。1.驗(yàn)證上傳來源通過token防止CSRF并通過finfo_file檢測真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串并根據(jù)檢測類型決定擴(kuò)展名存儲至非Web目錄;3.PHP配置限制上傳大小及臨時目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

在PHP中評論代碼 在PHP中評論代碼 Jul 18, 2025 am 04:57 AM

PHP注釋代碼常用方法有三種:1.單行注釋用//或#屏蔽一行代碼,推薦使用//;2.多行注釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧注釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時需注意閉合符號和避免嵌套。

發(fā)電機(jī)如何在PHP中工作? 發(fā)電機(jī)如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

撰寫PHP評論的提示 撰寫PHP評論的提示 Jul 18, 2025 am 04:51 AM

寫好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋應(yīng)解釋“為什么”而非“做了什么”,避免冗余或過于簡單。1.使用統(tǒng)一格式,如docblock(/*/)用于類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說明為何需手動輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護(hù)效率。

快速PHP安裝教程 快速PHP安裝教程 Jul 18, 2025 am 04:52 AM

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

如何通過php中的索引訪問字符串中的字符 如何通過php中的索引訪問字符串中的字符 Jul 12, 2025 am 03:15 AM

在PHP中獲取字符串特定索引字符可用方括號或花括號,但推薦方括號;索引從0開始,超出范圍訪問返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結(jié)果;實(shí)際應(yīng)用中循環(huán)訪問前應(yīng)檢查字符串長度,動態(tài)字符串需驗(yàn)證有效性,多語言項(xiàng)目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

學(xué)習(xí)PHP:初學(xué)者指南 學(xué)習(xí)PHP:初學(xué)者指南 Jul 18, 2025 am 04:54 AM

易于效率,啟動啟動tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

See all articles