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

目錄
PHP自定義注解:增強(qiáng)代碼靈活性和可擴(kuò)展性
首頁(yè) 后端開(kāi)發(fā) php教程 您自己的自定義注釋 - 不僅僅是評(píng)論!

您自己的自定義注釋 - 不僅僅是評(píng)論!

Feb 15, 2025 am 09:22 AM

PHP自定義注解:增強(qiáng)代碼靈活性和可擴(kuò)展性

本文探討如何在Symfony 3應(yīng)用中創(chuàng)建和使用自定義注解。注解是我們?cè)陬?lèi)、方法和屬性上方看到的文檔塊元數(shù)據(jù)/配置,常用于聲明控制器路由(@Route())、Doctrine ORM映射(@ORM())或控制對(duì)Rauth等包中各種類(lèi)和方法的訪(fǎng)問(wèn)。本文將介紹如何自定義注解,并在不加載類(lèi)的情況下讀取類(lèi)或方法信息。

關(guān)鍵要點(diǎn):

  • PHP自定義注解可用于向代碼添加元數(shù)據(jù),影響代碼行為,使其更靈活、更易于適應(yīng)。它們可用于定義路由信息、指定驗(yàn)證規(guī)則或配置依賴(lài)注入。
  • 創(chuàng)建PHP自定義注解需要定義一個(gè)新的類(lèi)來(lái)表示該注解。此類(lèi)應(yīng)具有與您希望在注解中設(shè)置的值相對(duì)應(yīng)的屬性。
  • Doctrine支持自定義注解。您可以定義自己的注解并將其用于Doctrine實(shí)體中。Doctrine的注解讀取器將解析這些注解,然后可以使用它們來(lái)影響實(shí)體的行為。
  • 使用PHP自定義注解的一個(gè)限制是它們不受語(yǔ)言本身的原生支持。這意味著您需要使用提供注解支持的庫(kù)或工具,例如Doctrine或PHP-DI。
  • PHP自定義注解的用途多種多樣,包括在Web應(yīng)用程序中定義路由信息、為表單輸入指定驗(yàn)證規(guī)則或配置依賴(lài)注入。它們還可用于向代碼添加文檔。

Your Own Custom Annotations - More than Just Comments!

免責(zé)聲明: 注解與Symfony無(wú)關(guān),它是作為Doctrine項(xiàng)目的一部分開(kāi)發(fā)的概念,用于解決將ORM信息映射到類(lèi)方法的問(wèn)題。

本文將構(gòu)建一個(gè)名為WorkerBundle的小型可重用捆綁包(僅用于演示目的,并非真正可打包的)。我們將開(kāi)發(fā)一個(gè)小型概念,允許定義各種以不同速度“運(yùn)行”的Worker類(lèi)型,然后應(yīng)用程序中的任何人都可以使用它們。實(shí)際的worker操作不在本文的討論范圍之內(nèi),因?yàn)槲覀冴P(guān)注的是設(shè)置管理它們的系統(tǒng)(并通過(guò)注解發(fā)現(xiàn)它們)。

您可以查看這個(gè)倉(cāng)庫(kù)并按照其中介紹的說(shuō)明在本地Symfony應(yīng)用程序中設(shè)置捆綁包。

Worker

Worker將實(shí)現(xiàn)一個(gè)接口,該接口需要一個(gè)方法:::work()。在新的WorkerBundle中,讓我們創(chuàng)建一個(gè)Workers/目錄來(lái)保持整潔,并在其中添加接口:

<?php
namespace WorkerBundle\Workers;

interface WorkerInterface
{
    /**
     * 執(zhí)行工作
     *
     * @return NULL
     */
    public function work();
}

注解

每個(gè)worker都必須實(shí)現(xiàn)上述接口。很清楚。但除此之外,我們還需要它們?cè)陬?lèi)上方有一個(gè)注解,以便找到它們并讀取有關(guān)它們的某些元數(shù)據(jù)。

Doctrine將文檔塊注解映射到一個(gè)類(lèi),該類(lèi)的屬性表示注解本身內(nèi)部的鍵。讓我們創(chuàng)建我們自己的注解并實(shí)際操作一下。

每個(gè)WorkerInterface實(shí)例在其文檔塊中都將具有以下注解:

<?php
namespace WorkerBundle\Workers;

interface WorkerInterface
{
    /**
     * 執(zhí)行工作
     *
     * @return NULL
     */
    public function work();
}

我們將保持簡(jiǎn)單,只有兩個(gè)屬性:唯一名稱(chēng)(字符串)和worker速度(整數(shù))。為了使Doctrine的注解庫(kù)能夠識(shí)別此注解,我們必須創(chuàng)建一個(gè)匹配的類(lèi),不出所料,它自己也有一些注解。

我們將此類(lèi)放在捆綁包命名空間的Annotation文件夾中,并將其簡(jiǎn)單地命名為Worker:

/**
 * @Worker(
 *     name = "唯一的Worker名稱(chēng)",
 *     speed = 10
 * )
 */

如您所見(jiàn),我們有兩個(gè)屬性和一些簡(jiǎn)單的getter方法。更重要的是,我們?cè)陧敳坑袃蓚€(gè)注解:@Annotation(告訴Doctrine此類(lèi)表示一個(gè)注解)和@Target("CLASS")(告訴它應(yīng)該在整個(gè)類(lèi)而不是方法或?qū)傩陨戏绞褂茫?。就是這樣,WorkerInterface類(lèi)現(xiàn)在可以通過(guò)確保在文件頂部使用use語(yǔ)句導(dǎo)入相應(yīng)的類(lèi)來(lái)使用此注解:

<?php
namespace WorkerBundle\Annotation;

use Doctrine\Common\Annotations\Annotation;

/**
 * @Annotation
 * @Target("CLASS")
 */
class Worker
{
    /**
     * @Required
     *
     * @var string
     */
    public $name;

    /**
     * @Required
     *
     * @var int
     */
    public $speed;

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @return int
     */
    public function getSpeed()
    {
        return $this->speed;
    }
}

管理器

接下來(lái),我們需要一個(gè)管理器,我們的應(yīng)用程序可以使用它來(lái)獲取所有可用worker的列表并創(chuàng)建它們。在與WorkerInterface相同的命名空間中,我們可以使用這個(gè)簡(jiǎn)單的管理器類(lèi):

use WorkerBundle\Annotation\Worker;

發(fā)現(xiàn)器

我們注解演示的關(guān)鍵部分實(shí)際上是發(fā)現(xiàn)過(guò)程的一部分。為什么?因?yàn)槲覀兪褂肳orker注解來(lái)確定是否應(yīng)將相應(yīng)的類(lèi)視為Worker。在此過(guò)程中,我們?cè)趯?shí)際實(shí)例化對(duì)象之前使用了元數(shù)據(jù)。讓我們看看我們的WorkerDiscovery類(lèi):

<?php
namespace WorkerBundle\Workers;

class WorkerManager
{
    // ... (代碼與原文相同) ...
}

連接起來(lái)

現(xiàn)在我們有了主要組件,是時(shí)候?qū)⑺袃?nèi)容連接起來(lái)了。首先,我們需要服務(wù)定義,因此在捆綁包的Resource/config文件夾中,我們可以有這個(gè)services.yml文件:

<?php
namespace WorkerBundle\Workers;

// ... (代碼與原文相同) ...
}

為了使我們的服務(wù)定義能夠被容器集中拾取,我們需要編寫(xiě)一個(gè)小的擴(kuò)展類(lèi)。因此,在捆綁包的DependencyInjection文件夾中,創(chuàng)建一個(gè)名為WorkerExtension的類(lèi)。位置和名稱(chēng)對(duì)于Symfony自動(dòng)拾取它都很重要。

services:
    worker_manager:
        class: WorkerBundle\Workers\WorkerManager
        arguments: ["@worker_discovery"]
    worker_discovery:
        class: WorkerBundle\Workers\WorkerDiscovery
        arguments: ["%worker_namespace%", "%worker_directory%", "%kernel.root_dir%", "@annotation_reader"]

最后,我們需要注冊(cè)我們的捆綁包。在我們的AppKernel中:

<?php
namespace WorkerBundle\DependencyInjection;

// ... (代碼與原文相同) ...
}

就是這樣。

讓我們工作!

現(xiàn)在我們準(zhǔn)備工作了。讓我們?cè)谥醒雙arameters.yml文件中配置我們的worker將在哪里找到:

public function registerBundles()
{
    return array(
        // ...
        new WorkerBundle\WorkerBundle(),
        // ...
    );
}

這些參數(shù)從容器傳遞到WorkerDiscovery類(lèi),如上所述。

位置由您決定,但現(xiàn)在讓我們將我們的worker放在應(yīng)用程序的主要AppBundle捆綁包中。我們的第一個(gè)worker可能如下所示:

<?php
namespace WorkerBundle\Workers;

interface WorkerInterface
{
    /**
     * 執(zhí)行工作
     *
     * @return NULL
     */
    public function work();
}

我們的注解在那里,use語(yǔ)句到位,因此沒(méi)有任何東西可以阻止某些業(yè)務(wù)邏輯找到它并實(shí)例化它。讓我們假設(shè)在一個(gè)Controller方法內(nèi)部:

/**
 * @Worker(
 *     name = "唯一的Worker名稱(chēng)",
 *     speed = 10
 * )
 */

或者

<?php
namespace WorkerBundle\Annotation;

use Doctrine\Common\Annotations\Annotation;

/**
 * @Annotation
 * @Target("CLASS")
 */
class Worker
{
    /**
     * @Required
     *
     * @var string
     */
    public $name;

    /**
     * @Required
     *
     * @var int
     */
    public $speed;

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @return int
     */
    public function getSpeed()
    {
        return $this->speed;
    }
}

結(jié)論

我們現(xiàn)在可以使用注解來(lái)表達(dá)有關(guān)類(lèi)(或方法和屬性)的元數(shù)據(jù)。在本教程中,我們構(gòu)建了一個(gè)小型包,它使應(yīng)用程序(或其他外部捆綁包)能夠通過(guò)定義有關(guān)它們的某些元數(shù)據(jù)來(lái)聲明能夠執(zhí)行某些工作的worker。此元數(shù)據(jù)不僅使它們易于發(fā)現(xiàn),而且還提供有關(guān)是否應(yīng)該實(shí)際使用它們的信息。

Your Own Custom Annotations - More than Just Comments!

您在自己的項(xiàng)目中使用自定義注解嗎?如果是這樣,您是如何實(shí)現(xiàn)它們的?也許還有第三種方法?讓我們知道!


(感興趣了解更多關(guān)于Symfony、Doctrine、注解以及各種企業(yè)級(jí)PHP內(nèi)容的信息?加入我們,參加為期三天的動(dòng)手研討會(huì),WebSummerCamp——唯一一個(gè)完全手動(dòng)的會(huì)議,并且還會(huì)照顧您想帶去的任何人!)

(原文的FAQ部分已省略,因?yàn)槠鋬?nèi)容與已翻譯和改寫(xiě)的內(nèi)容高度重復(fù)。)

以上是您自己的自定義注釋 - 不僅僅是評(píng)論!的詳細(xì)內(nèi)容。更多信息請(qǐng)關(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)容,請(qǐng)聯(lián)系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

用于從照片中去除衣服的在線(xiàn)人工智能工具。

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話(huà)題

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

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

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

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

在PHP中評(píng)論代碼 在PHP中評(píng)論代碼 Jul 18, 2025 am 04:57 AM

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

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

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

撰寫(xiě)PHP評(píng)論的提示 撰寫(xiě)PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

寫(xiě)好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋?xiě)?yīng)解釋“為什么”而非“做了什么”,避免冗余或過(guò)于簡(jiǎn)單。1.使用統(tǒng)一格式,如docblock(/*/)用于類(lèi)、方法說(shuō)明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說(shuō)明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說(shuō)明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問(wèn)題,便于后續(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

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

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

如何通過(guò)php中的索引訪(fǎng)問(wèn)字符串中的字符 如何通過(guò)php中的索引訪(fǎng)問(wèn)字符串中的字符 Jul 12, 2025 am 03:15 AM

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

See all articles