国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

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

Feb 24, 2025 am 10:42 AM

PHP Master | Logging with PSR-3 to Improve Reusability

核心要點(diǎn)

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

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

PSR-3快速入門

在我們了解PSR-3如何使我們的代碼更可重用之前,有必要了解PSR-3是什麼。如果您已經(jīng)熟悉PSR-3,可以跳過(guò)本節(jié)。規(guī)範(fàn)的核心是日誌對(duì)象的接口。此接口公開(kāi)了八種方法來(lái)處理不同嚴(yán)重級(jí)別的消息,以及一個(gè)通用的log()方法,可以接受任意嚴(yán)重級(jí)別。 PSR-3支持的八個(gè)嚴(yán)重級(jí)別基於RFC 5424,如下所述:

  • emergency – 系統(tǒng)無(wú)法使用
  • alert – 需要立即採(cǎi)取行動(dòng)
  • critical – 嚴(yán)重狀況
  • error – 不需要立即關(guān)注但應(yīng)監(jiān)控的錯(cuò)誤
  • warning – 不尋?;虿幌Ml(fā)生的事件,但並非錯(cuò)誤
  • notice – 正常但重要的事件
  • info – 有趣的事件
  • debug – 用於調(diào)試的詳細(xì)信息

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

獲取PSR-3文件

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

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

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

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

<?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)建一個(gè)Monolog對(duì)象
$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");

運(yùn)行此代碼將在mail.log文件中創(chuàng)建一個(gè)新條目,記錄已發(fā)送電子郵件。此時(shí),我們可能會(huì)認(rèn)為我們已經(jīng)編寫(xiě)了一個(gè)可重用的Mailer對(duì)象。我們使用依賴注入使日誌記錄器可用於Mailer,因此我們可以交換不同的日誌記錄器配置,而無(wú)需觸及我們的Mailer代碼??雌饋?lái)我們已經(jīng)成功遵循了SOLID原則並避免了創(chuàng)建任何硬依賴。但是,假設(shè)我們想在使用Analog處理日誌記錄交互的不同項(xiàng)目中重用Mailer類?,F(xiàn)在我們遇到了問(wèn)題,因?yàn)锳nalog沒(méi)有addInfo()方法。要使用Analog記錄信息級(jí)別消息,我們調(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"
    }
}

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

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

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

<?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的實(shí)現(xiàn)者,並且sendEmail()方法現(xiàn)在調(diào)用PSR-3中指定的info()方法。 Monolog已經(jīng)符合PSR-3,並且Analog提供了一個(gè)實(shí)現(xiàn)LoggerInterface的包裝器對(duì)象,因此我們現(xiàn)在可以使用這兩個(gè)日誌記錄器而無(wú)需修改Mailer類。以下是如何使用Monolog調(diào)用該類的:

<?php
// 創(chuàng)建一個(gè)Monolog對(duì)象
$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對(duì)象與任何庫(kù)一起使用,而無(wú)需編輯Mailer類或更改我們使用它的方式。

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

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

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

log()方法只是將LoggerInterface方法映射到各自的KLogger方法,而KLogger處理實(shí)際的日誌記錄活動(dòng)。通過(guò)這種方式包裝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)試級(jí)別消息的第二個(gè)參數(shù),因此即使使用適配器,它也不完全符合PSR-3。擴(kuò)展KLogger以使其完全與PSR-3兼容將是一項(xiàng)微不足道的任務(wù),但這超出了本文的範(fàn)圍。但是,可以肯定地說(shuō),使用我們的適配器類使我們非常接近完全符合PSR-3,並允許我們使用LoggerInterface與KLogger類一起使用。

結(jié)論

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

(圖片來(lái)自Fotolia)

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

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整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

對(duì)基於PHP的API進(jìn)行版本控制的最佳實(shí)踐是什麼? 對(duì)基於PHP的API進(jìn)行版本控制的最佳實(shí)踐是什麼? Jun 14, 2025 am 12:27 AM

基於toversionaphp,useUrl deuseUrl specteringforclarityAndEsofRouting,單獨(dú)的codetoavoidConflicts,dremecateOldVersionswithClearCommunication,andConsiderCustomHeadeSerlySerallyWhennEnncelsy.startbyplacingtheversionIntheUrl(E.G.,epi/api/v

如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? 如何在PHP中實(shí)施身份驗(yàn)證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

PHP中有哪些弱參考(弱圖),何時(shí)有用? PHP中有哪些弱參考(弱圖),何時(shí)有用? Jun 14, 2025 am 12:25 AM

PHPdoesnothaveabuilt-inWeakMapbutoffersWeakReferenceforsimilarfunctionality.1.WeakReferenceallowsholdingreferenceswithoutpreventinggarbagecollection.2.Itisusefulforcaching,eventlisteners,andmetadatawithoutaffectingobjectlifecycles.3.YoucansimulateaWe

PHP中的程序和麵向?qū)ο蟮木幊坦?fàn)例之間有什麼區(qū)別? PHP中的程序和麵向?qū)ο蟮木幊坦?fàn)例之間有什麼區(qū)別? Jun 14, 2025 am 12:25 AM

procemal and object-tiriendedprogromming(oop)inphpdiffersimplessintustructure,可重複使用性和datahandling.1.procedural-Progrogursmingusesfunctimesfunctionsormanized sequalized sequalized sequiential,poiperforsmallscripts.2.OpporganizesCodeOrganizescodeOdeIntsocloceSandObjects,ModelingReal-Worlden-Worlden

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在於驗(yàn)證文件類型、重命名文件並限制權(quán)限。 1.使用finfo_file()檢查真實(shí)MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機(jī)文件名,存儲(chǔ)至非Web根目錄;3.通過(guò)php.ini和HTML表單限製文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強(qiáng)安全性。這些步驟有效防止安全漏洞,確保文件上傳過(guò)程安全可靠。

如何與PHP的NOSQL數(shù)據(jù)庫(kù)(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(kù)(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過(guò)特定擴(kuò)展或庫(kù)與MongoDB和Redis等NoSQL數(shù)據(jù)庫(kù)交互。首先,使用MongoDBPHP驅(qū)動(dòng)(通過(guò)PECL或Composer安裝)創(chuàng)建客戶端實(shí)例並操作數(shù)據(jù)庫(kù)及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫(kù)或phpredis擴(kuò)展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用於高性能場(chǎng)景,Predis則便於快速部署;兩者均適用於生產(chǎn)環(huán)境且文檔完善。

PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在於類型檢查的嚴(yán)格程度。 ==在比較前會(huì)進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會(huì)返回true,例如5==="5"返回false。使用場(chǎng)景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時(shí)使用。

我如何了解最新的PHP開(kāi)發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開(kāi)發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

See all articles