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

首頁 后端開發(fā) php教程 PHP主|使用PSR-3登錄以提高可重用性

PHP主|使用PSR-3登錄以提高可重用性

Feb 24, 2025 am 10:42 AM

PHP Master | Logging with PSR-3 to Improve Reusability

核心要點

  • PSR-3,一個通用的日志對象接口,允許開發(fā)者編寫可重用的代碼,而無需依賴任何特定的日志實現(xiàn),從而提高了PHP中不同日志庫之間的兼容性。
  • PSR-3接口提供了八種方法來處理不同嚴重級別的消息,以及一個通用的log()方法,可以接收任意嚴重級別。其設(shè)計目的是為了解決日志實現(xiàn)不兼容的問題。
  • 盡管PSR-3有很多好處,但有些日志庫并不原生支持它。然而,開發(fā)者可以通過利用適配器模式和擴展Psr/Log庫中提供的AbstractLogger類來創(chuàng)建符合PSR-3的適配器。
  • 許多主要的PHP項目,包括Monolog、Symfony和Mustache.php,都已經(jīng)添加了對PSR-3的支持。由于它降低了代碼重用的障礙,預(yù)計會有更多庫和框架正確使用日志記錄,為開發(fā)者提供有用的信息。

在PHP開發(fā)中,日志記錄是最常見的任務(wù)之一。我們使用日志來跟蹤錯誤消息、記錄重要事件和調(diào)試代碼問題。在任何PHP項目中,代碼中都可能充滿了對日志庫的調(diào)用,這些庫為我們處理這些操作。不幸的是,在代碼中散布著對日志庫的調(diào)用,這使得代碼依賴于該庫的可用性,這明顯違反了依賴倒置原則。即使我們使用依賴注入讓我們的對象訪問日志庫,日志庫之間的差異也意味著在它們之間切換可能很困難且費時,需要對整個代碼庫進行重大重構(gòu)。為了提高日志庫之間的兼容性,PHP-FIG小組最近發(fā)布了PSR-3,這是一個通用的日志對象接口。在本文中,我將討論PSR-3定義的日志接口如何允許我們編寫不依賴于任何特定日志實現(xiàn)的可重用代碼。

PSR-3快速入門

在我們了解PSR-3如何使我們的代碼更可重用之前,有必要了解PSR-3是什么。如果您已經(jīng)熟悉PSR-3,可以跳過本節(jié)。規(guī)范的核心是日志對象的接口。此接口公開了八種方法來處理不同嚴重級別的消息,以及一個通用的log()方法,可以接受任意嚴重級別。PSR-3支持的八個嚴重級別基于RFC 5424,如下所述:

  • emergency – 系統(tǒng)無法使用
  • alert – 需要立即采取行動
  • critical – 嚴重狀況
  • error – 不需要立即關(guān)注但應(yīng)監(jiān)控的錯誤
  • warning – 不尋常或不希望發(fā)生的事件,但并非錯誤
  • notice – 正常但重要的事件
  • info – 有趣的事件
  • debug – 用于調(diào)試的詳細信息

每個日志方法都接受一個消息,該消息必須是字符串或具有__toString()方法的對象。附加參數(shù)接受一個數(shù)組,可以提供日志消息的上下文信息。可以在PSR-3規(guī)范中找到這些方法和參數(shù)的完整說明。

獲取PSR-3文件

獲取使用PSR-3所需的文件很容易——您可以在Psr/Log GitHub存儲庫中找到它們。您也可以使用Composer從Packagist獲取這些文件。下面是一個用于檢索Psr/Log文件的示例composer.json文件:

{
    "require": {
        "psr/log": "dev-master"
    }
}

日志記錄如何限制代碼重用

PHP有很多不同的日志庫,每個庫都有自己收集和記錄數(shù)據(jù)的方法。雖然它們之間有一些共同點,但每個庫都有自己獨特的一套日志方法。這意味著在日志之間切換可能具有挑戰(zhàn)性,通常需要更改任何使用日志記錄的地方的代碼。這與代碼重用和面向?qū)ο笤O(shè)計的SOLID原則背道而馳。我們面臨的局面是:要么聲明對特定日志庫的依賴,要么完全避免日志記錄。為了更清楚地說明這個問題,需要一個具體的例子。假設(shè)我們正在創(chuàng)建一個簡單的Mailer對象來處理發(fā)送電子郵件。我們希望Mailer在每次發(fā)送電子郵件時記錄一條消息,并且我們決定使用優(yōu)秀的Monolog庫來處理我們的日志記錄需求。

<?php namespace Email;

class Mailer
{
    private $logger;

    public function __construct($logger)
    {
        $this->logger = $logger;
    }

    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        $this->logger->addInfo("Email sent to $emailAddress");
    }
}

我們可以使用以下代碼使用此類:

<?php
// 創(chuàng)建一個Monolog對象
$logger = new Monolog\Logger("Mail");
$logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log"));

// 創(chuàng)建郵件發(fā)送器并發(fā)送電子郵件
$mailer = new Email\Mailer($logger);
$mailer->sendEmail("email@example.com");

運行此代碼將在mail.log文件中創(chuàng)建一個新條目,記錄已發(fā)送電子郵件。此時,我們可能會認為我們已經(jīng)編寫了一個可重用的Mailer對象。我們使用依賴注入使日志記錄器可用于Mailer,因此我們可以交換不同的日志記錄器配置,而無需觸及我們的Mailer代碼??雌饋砦覀円呀?jīng)成功遵循了SOLID原則并避免了創(chuàng)建任何硬依賴。但是,假設(shè)我們想在使用Analog處理日志記錄交互的不同項目中重用Mailer類。現(xiàn)在我們遇到了問題,因為Analog沒有addInfo()方法。要使用Analog記錄信息級別消息,我們調(diào)用Analog::log($message, Analog::INFO)。我們可以修改Mailer類以使用Analog的方法,如下所示。

<?php namespace Email;

class Mailer
{
    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        Analog::log("Email sent to $emailAddress", Analog::INFO);
    }
}

我們可以使用以下代碼使用更新后的Mailer類:

{
    "require": {
        "psr/log": "dev-master"
    }
}

雖然這會起作用,但這遠非理想。我們遇到了Mailer對特定日志記錄實現(xiàn)的依賴,這要求在引入新的日志記錄器時更改類。這使得類不太可重用,并迫使我們必須在依賴于特定日志記錄器的可用性或完全放棄類中的日志記錄之間做出選擇。

使用PSR-3避免日志記錄器依賴

正如Alejandro Gervasio在他關(guān)于該主題的優(yōu)秀文章中解釋的那樣,依賴倒置原則告訴我們,我們應(yīng)該依賴抽象而不是具體實現(xiàn)。在日志記錄的情況下,我們目前的問題一直是缺乏一個可以依賴的合適的抽象。這就是PSR-3發(fā)揮作用的地方。PSR-3旨在通過為日志記錄器提供一個通用接口(恰當?shù)孛麨?code>LoggerInterface)來克服日志記錄實現(xiàn)不兼容的問題。通過提供一個不綁定到任何特定實現(xiàn)的接口,PSR-3使我們無需依賴特定的日志記錄器——我們可以改為對LoggerInterface進行類型提示以獲取符合PSR-3的日志記錄器。我已經(jīng)更新了下面的Mailer類來演示這一點:

<?php namespace Email;

class Mailer
{
    private $logger;

    public function __construct($logger)
    {
        $this->logger = $logger;
    }

    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        $this->logger->addInfo("Email sent to $emailAddress");
    }
}

構(gòu)造函數(shù)已修改為接受LoggerInterface的實現(xiàn)者,并且sendEmail()方法現(xiàn)在調(diào)用PSR-3中指定的info()方法。Monolog已經(jīng)符合PSR-3,并且Analog提供了一個實現(xiàn)LoggerInterface的包裝器對象,因此我們現(xiàn)在可以使用這兩個日志記錄器而無需修改Mailer類。以下是如何使用Monolog調(diào)用該類的:

<?php
// 創(chuàng)建一個Monolog對象
$logger = new Monolog\Logger("Mail");
$logger->pushHandler(new Monolog\Handler\StreamHandler("mail.log"));

// 創(chuàng)建郵件發(fā)送器并發(fā)送電子郵件
$mailer = new Email\Mailer($logger);
$mailer->sendEmail("email@example.com");

以及使用Analog:

<?php namespace Email;

class Mailer
{
    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        Analog::log("Email sent to $emailAddress", Analog::INFO);
    }
}

現(xiàn)在,我們能夠使用我們的Mailer對象與任何庫一起使用,而無需編輯Mailer類或更改我們使用它的方式。

為不支持PSR-3的日志記錄器使用適配器模式

到目前為止,我們已經(jīng)通過請求LoggerInterface的實現(xiàn)者成功地將Mailer對象與任何特定的日志記錄實現(xiàn)解耦。但是,那些尚未添加對PSR-3支持的日志記錄器呢?例如,流行的KLogger庫已經(jīng)有一段時間沒有更新了,目前與PSR-3不兼容。幸運的是,我們可以通過利用適配器模式輕松地將KLogger公開的方法映射到LoggerInterface中定義的方法。Psr/Log存儲庫中的支持文件使我們能夠通過提供一個我們可以擴展的AbstractLogger類來輕松創(chuàng)建適配器類。抽象類只是將LoggerInterface中定義的八個特定于級別的日志方法轉(zhuǎn)發(fā)到一個通用的log()方法。通過擴展AbstractLogger類并定義我們自己的log()方法,我們可以輕松地為不原生支持PSR-3的日志記錄器創(chuàng)建符合PSR-3的適配器。我將在下面通過為KLogger創(chuàng)建一個簡單的適配器來演示這一點:

{
    "require": {
        "psr/log": "dev-master"
    }
}

log()方法只是將LoggerInterface方法映射到各自的KLogger方法,而KLogger處理實際的日志記錄活動。通過這種方式包裝KLogger類,我們能夠在不破壞LoggerInterface契約的情況下使用它。我們現(xiàn)在可以使用KLogger適配器與Mailer類一起使用:

<?php namespace Email;

class Mailer
{
    private $logger;

    public function __construct($logger)
    {
        $this->logger = $logger;
    }

    public function sendEmail($emailAddress)
    {
        // 發(fā)送電子郵件的代碼...

        // 記錄消息
        $this->logger->addInfo("Email sent to $emailAddress");
    }
}

使用適配器類,我們能夠在不修改Mailer類的情況下使用KLogger,并且仍然遵守LoggerInterface。KLogger不接受調(diào)試級別消息的第二個參數(shù),因此即使使用適配器,它也不完全符合PSR-3。擴展KLogger以使其完全與PSR-3兼容將是一項微不足道的任務(wù),但這超出了本文的范圍。但是,可以肯定地說,使用我們的適配器類使我們非常接近完全符合PSR-3,并允許我們使用LoggerInterface與KLogger類一起使用。

結(jié)論

在本文中,我們已經(jīng)了解了如何使用PSR-3來幫助我們編寫與日志記錄器無關(guān)的代碼,這些代碼不依賴于特定的日志記錄實現(xiàn)。許多主要的PHP項目已經(jīng)添加了對PSR-3的支持,包括Monolog、Symfony和Mustache.php,以及Drupal等其他知名項目正在討論如何最好地集成它。由于PSR-3降低了代碼重用的障礙,我們應(yīng)該看到更多庫和框架正確使用日志記錄,為開發(fā)者提供有用的信息。PSR-3會影響您在應(yīng)用程序中使用日志記錄的方式嗎?請在下面的評論部分告訴我們。

(圖片來自Fotolia)

(PSR-3日志記錄的常見問題解答部分,由于篇幅限制,此處省略。 可以根據(jù)需要添加。)

以上是PHP主|使用PSR-3登錄以提高可重用性的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

PHP正則密碼強度 PHP正則密碼強度 Jul 03, 2025 am 10:33 AM

判斷密碼強度需結(jié)合正則與邏輯處理,基礎(chǔ)要求包括:1.長度不少于8位;2.至少含小寫字母、大寫字母、數(shù)字;3.可加入特殊字符限制;進階方面需避免連續(xù)重復字符及遞增/遞減序列,這需PHP函數(shù)檢測;同時應(yīng)引入黑名單過濾常見弱密碼如password、123456;最終建議結(jié)合zxcvbn庫提升評估精度。

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

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

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

發(fā)電機如何在PHP中工作? 發(fā)電機如何在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.強調(diào)邏輯背后的原因,如說明為何需手動輸出JS跳轉(zhuǎn);3.在復雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標記待辦事項與問題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護效率。

快速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 18, 2025 am 04:54 AM

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

See all articles