在學說實體中使用特徵
鑰匙要點
-
自PHP 5.4.0以來可用的特徵,提供了一種通過在另一類中包含一組方法,從而減少代碼重複來提供重複使用代碼的方法。它們可以與Symfony環境中的學說ORM結合使用。
- > 特徵不應與接口相混淆。界面是說明對象可以做什麼的合同,但特徵使對象具有執行功能。
- > 特徵在組織數據庫體系結構和避免代碼重複方面特別有用。例如,當創建需要“ create_at”和“ updated_at”字段的文章和評論實體時,這些常見屬性可以包含在特徵中以避免重複。
- > >特徵是生產更輕,更靈活的代碼的絕佳工具,但不應過度使用它們。有時,構建獨特的類實現可能會更好。花費足夠的時間正確設計您的應用程序至關重要。
- 自PHP 5.4.0以來,PHP支持一種精美的方法來重用稱為“特徵”的代碼 - 您可以在另一類中包含的一組方法,以免重複自己。您可以在先前發布的SitePoint帖子中閱讀有關特徵的更多信息:此處,此處和此處。
今天,我將向您展示如何在符號環境中與學說ORM一起使用。

>正如我們所看到的,基本方法sayhello()在通過使用語句的A和B類實現的性狀中聲明。容易,對吧?這個示例確實很短,但是它應該為您提供基本知識來使用特質。
><span><span><?php </span></span><span><span>trait ExampleTrait { </span></span><span> <span>public function sayHello() { </span></span><span> <span>echo "Hello"; </span></span><span> <span>} </span></span><span><span>} </span></span><span> </span><span><span>class A { </span></span><span> <span>use ExampleTrait; </span></span><span><span>} </span></span><span> </span><span><span>class B { </span></span><span> <span>use ExampleTrait; </span></span><span><span>} </span></span><span> </span><span><span>$one = new A(); </span></span><span><span>$one->sayHello(); /* return `Hello` */ </span></span><span> </span><span><span>$two = new B(); </span></span><span><span>$two->sayHello(); /* return `Hello`, too */</span></span>
請允許我警告您這樣一個事實,即許多人傾向於看不到特質和界面之間的區別。這是一個務實的解釋:
>接口是一份合同,上面寫著“此對象能夠做這件事”,而特徵使對象具有做事的能力。
要進行更深入的解釋,請隨時查看菲利普·布朗(Philip Brown)的這一有見地的帖子,以前的報價來自。>兩個實體將受益於創建的_at和updated_at字段(因此,我們可以在稍後對這些列進行排序)。但是,在挖掘特徵之前,讓我們看看我們如何在沒有它們的情況下在學說中構建這些實體。在組織數據庫體系結構方面,面對代碼重複並不少見。例如,假設我們必須開發通常的博客應用程序。在某個時候,我們可能會創建一個基本文章實體,也可能是一個評論實體。
>步驟1:創建實體
文章實體
<span><span><?php </span></span><span><span>trait ExampleTrait { </span></span><span> <span>public function sayHello() { </span></span><span> <span>echo "Hello"; </span></span><span> <span>} </span></span><span><span>} </span></span><span> </span><span><span>class A { </span></span><span> <span>use ExampleTrait; </span></span><span><span>} </span></span><span> </span><span><span>class B { </span></span><span> <span>use ExampleTrait; </span></span><span><span>} </span></span><span> </span><span><span>$one = new A(); </span></span><span><span>$one->sayHello(); /* return `Hello` */ </span></span><span> </span><span><span>$two = new B(); </span></span><span><span>$two->sayHello(); /* return `Hello`, too */</span></span>
>註釋實體
<span><span><?php </span></span><span><span>namespace Blog<span>\AppBundle\Entity</span>; </span></span><span> </span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM; </span></span><span> </span><span><span>/** </span></span><span><span> * @ORM\Table(name="article") </span></span><span><span> * @ORM\Entity(repositoryClass="Blog\AppBundle\Entity\ArticleRepository") </span></span><span><span> */ </span></span><span><span>class Article </span></span><span><span>{ </span></span><span> <span>/** </span></span><span><span> * @ORM\Column(name="idArticle" type="integer") </span></span><span><span> * @ORM\Id() </span></span><span><span> * @ORM\GeneratedValue(strategy="AUTO") </span></span><span><span> */ </span></span><span> <span>private $id; </span></span><span> </span><span> <span>/* Other properties you need in your entity: $title, $content, $author... */ </span></span><span> </span><span> <span>/** @ORM\Column(name="created_at" type="datetime") */ </span></span><span> <span>private $createdAt; </span></span><span> </span><span> <span>/** @ORM\Column(name="updated_at" type="datetime") */ </span></span><span> <span>private $updatedAt; </span></span><span> </span><span> <span>/* Getters & Setters */ </span></span><span><span>}</span></span>
>在兩個類中都包含相同的屬性$創建和$ UPDATAT。這遠非干燥。特徵可以幫助我們清理此代碼嗎?
步驟2:創建特質
<span><span><?php </span></span><span><span>namespace Blog<span>\AppBundle\Entity</span>; </span></span><span> </span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM; </span></span><span> </span><span><span>/** </span></span><span><span> * @ORM\Table(name="comment") </span></span><span><span> * @ORM\Entity(repositoryClass="Blog\AppBundle\Entity\CommentRepository") </span></span><span><span> */ </span></span><span><span>class Comment </span></span><span><span>{ </span></span><span> <span>/** </span></span><span><span> * @ORM\Column(name="idComment" type="integer") </span></span><span><span> * @ORM\Id() </span></span><span><span> * @ORM\GeneratedValue(strategy="AUTO") </span></span><span><span> */ </span></span><span> <span>private $id; </span></span><span> </span><span> <span>/* Other properties you need in your entity */ </span></span><span> </span><span> <span>/** @ORM\Column(name="created_at" type="datetime") */ </span></span><span> <span>private $createdAt; </span></span><span> </span><span> <span>/** @ORM\Column(name="updated_at" type="datetime") */ </span></span><span> <span>private $updatedAt; </span></span><span> </span><span> <span>/* Getters & Setters */ </span></span><span><span>}</span></span>
這是一個漂亮的特徵文件,我們已經移動了初始重複的代碼。 $ CREATTAT和$ UPDATAT以及所有相關方法現在都與實體分開。結果,在其他地方使用它們會更容易。請記住帶有關鍵字使用的介紹部分。
>步驟3:重構實體
文章實體
<span><span><?php </span></span><span><span>// src/Blog/AppBundle/Entity/Traits/TimestampableTrait.php </span></span><span> </span><span><span>namespace Blog<span>\AppBundle\Entity\Traits</span>; </span></span><span> </span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM; </span></span><span> </span><span><span>trait TimestampableTrait </span></span><span><span>{ </span></span><span> <span>/** </span></span><span><span> * <span>@var datetime $createdAt </span></span></span><span><span> * </span></span><span><span> * @ORM\Column(name="created_at", type="datetime") </span></span><span><span> */ </span></span><span> <span>private $createdAt; </span></span><span> </span><span> <span>/** </span></span><span><span> * <span>@var datetime $updatedAt </span></span></span><span><span> * </span></span><span><span> * @ORM\Column(name="updated_at", type="datetime") </span></span><span><span> */ </span></span><span> <span>private $updatedAt; </span></span><span> </span><span> </span><span> <span>/** </span></span><span><span> * Get createdAt </span></span><span><span> * </span></span><span><span> * <span>@return datetime </span></span></span><span><span> */ </span></span><span> <span>public function getCreatedAt() </span></span><span> <span>{ </span></span><span> <span>return $this->createdAt; </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Set createdAt </span></span><span><span> * </span></span><span><span> * <span>@param datetime $createdAt </span></span></span><span><span> */ </span></span><span> <span>public function setCreatedAt($createdAt) </span></span><span> <span>{ </span></span><span> <span>$this->createdAt = $createdAt; </span></span><span> </span><span> <span>return $this; </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Get updatedAt </span></span><span><span> * </span></span><span><span> * <span>@return datetime </span></span></span><span><span> */ </span></span><span> <span>public function getUpdatedAt() </span></span><span> <span>{ </span></span><span> <span>return $this->updatedAt; </span></span><span> <span>} </span></span><span> </span><span> <span>/** </span></span><span><span> * Set updatedAt </span></span><span><span> * </span></span><span><span> * <span>@param datetime $updatedAt </span></span></span><span><span> */ </span></span><span> <span>public function setUpdatedAt($updatedAt) </span></span><span> <span>{ </span></span><span> <span>$this->updatedAt = $updatedAt; </span></span><span> </span><span> <span>return $this; </span></span><span> <span>} </span></span><span><span>}</span></span>
>註釋實體
<span><span><?php </span></span><span><span>// src/Blog/AppBundle/Entity/Article.php </span></span><span> </span><span><span>namespace Blog<span>\AppBundle\Entity</span>; </span></span><span> </span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM; </span></span><span><span>use Blog<span>\AppBundle\Entity\Traits\TimestampableTrait</span>; </span></span><span> </span><span><span>class Article </span></span><span><span>{ </span></span><span> <span>use TimestampableTrait; </span></span><span> </span><span> <span>/** </span></span><span><span> * @ORM\Column(name="idArticle" type="integer") </span></span><span><span> * @ORM\Id() </span></span><span><span> * @ORM\GeneratedValue(strategy="AUTO") </span></span><span><span> */ </span></span><span> <span>private $id; </span></span><span> </span><span> <span>/* Other properties you need in your entity */ </span></span><span> </span><span> <span>/* Getters & Setters */ </span></span><span><span>}</span></span>
完成!讓我們玩命令行。首先,讓我們在數據庫中創建實體:
<span><span><?php </span></span><span><span>// src/Blog/AppBundle/Entity/Comment.php </span></span><span> </span><span><span>namespace Blog<span>\AppBundle\Entity</span>; </span></span><span> </span><span><span>use Doctrine<span>\ORM\Mapping</span> as ORM; </span></span><span><span>use Blog<span>\AppBundle\Entity\Traits\TimestampableTrait</span>; </span></span><span> </span><span><span>/** </span></span><span><span> * @ORM\Table(name="comment") </span></span><span><span> * @ORM\Entity(repositoryClass="Blog\AppBundle\Entity\CommentRepository") </span></span><span><span> */ </span></span><span><span>class Comment </span></span><span><span>{ </span></span><span> <span>use TimestampableTrait; </span></span><span> </span><span> <span>/** </span></span><span><span> * @ORM\Column(name="idComment" type="integer") </span></span><span><span> * @ORM\Id() </span></span><span><span> * @ORM\GeneratedValue(strategy="AUTO") </span></span><span><span> */ </span></span><span> <span>private $id; </span></span><span> </span><span> <span>/* Other properties you need in your entity */ </span></span><span> </span><span> <span>/* Getters & Setters */ </span></span><span><span>}</span></span>
此命令將產生:
php app/console doctrine:schema:create
現在,如果要從這些類創建新對象,您會發現它們倆都有可用的常見方法:
`Article Entity` | idArticle | *All our other fields...* | created_at | updated_at | |-----------|---------------------------|------------|------------| `Comment Entity` | idComment | *All our other fields...* | created_at | updated_at | |-----------|---------------------------|------------|------------|
進一步
當前,在Symfony Sphere中,許多捆綁包和擴展往往會堅持這種做事的方式。來自Knplabs的教義Behaviors庫為實體和存儲庫提供了很多特徵。在同一心態下,我建議您深入了解眾所周知的教義延期捆綁包,尤其是有關時間通知行為擴展的所有內容。
>最終想法
特徵並不難吸收。它們是生產更輕,更靈活的代碼的絕佳方法。注意不要濫用它們:有時候,最好構建獨特的班級實現。我不能足夠強調花費足夠的時間才能正確設計您的應用是多麼重要。如果您認為他們可以幫助您,請試一試。創建您的,測試它們,並告訴我們您如何使用它們!
>關於在學說實體中使用特徵的常見問題(常見問題解答)
>在學說實體中使用特質的好處是什麼?>我如何在學說實體中使用特徵?
在學說實體中使用特質,您首先需要定義特徵。這是使用特徵關鍵字完成的,其次是特徵的名稱和一個包含特徵提供的方法和屬性的代碼塊。定義性狀後,您可以在類中添加使用語句,然後在特徵的名稱中添加使用語句來使用它。這將使課程中可用的特徵的所有方法和屬性。
我可以在單個學說實體中使用多個特徵嗎?實體。這是通過在類定義中添加多重用法語句來完成的,每個語句隨後添加了不同特徵的名稱。所有特徵的方法和屬性將在同類中可用。如果不同性狀中的方法或屬性之間存在命名衝突,則可以使用代替和運算符來解決它。
>>特徵可以注入服務嗎?
>
我可以將特質與繼承結合使用嗎? ,您可以將特徵與繼承結合使用。類可以從父班繼承,也可以使用一個或多個特徵。父類的方法和屬性和特質都將在類中可用。如果父母類中的方法或屬性之間存在命名衝突,則特徵中的版本將被使用。特徵為代碼重用和靈活性提供了強大的工具,它們也有一些局限性和潛在的缺點。一個限制是,不能自行實例化特徵 - 它們只能在班級中使用。同樣,如果多個特徵定義了具有相同名稱的方法,則可能需要手動解決命名衝突。過度使用性狀也可能導致難以理解和維護的代碼,因此應明智地使用它們。我如何測試使用特徵的學說實體?
>測試使用特徵的學說實體類似於測試常規學說實體。您可以創建實例化實體並調用其方法的單元測試,以檢查其表現是否如預期。如果特徵提供其他方法,則可以以相同的方式測試這些方法。如果特徵覆蓋了實體中的方法,則應同時測試該方法的原始版本(通過在不使用特徵的實體上測試它)和覆蓋版本(通過在使用特徵的實體上測試它) 。
>我可以在具有Symfony的學說實體中使用特徵嗎? Symfony的學說整合支持在實體中使用特徵。您可以定義自己的特徵,在您的實體中使用它們,並在與您的實體合作時會識別並使用它們。
>我如何調試學說實體中特徵的問題?學說實體中的特徵類似於調試常規學說實體的問題。您可以使用Xdebug和var_dump()之類的工具來檢查實體的狀態,並查看它們的方法和屬性。如果方法不按預期的方式行事,則可以檢查該方法是在實體本身,性狀還是在父級中定義的,並相應地調試。
以上是在學說實體中使用特徵的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

在PHP中,include,require,include_once,require_once的區別在於:1)include產生警告並繼續執行,2)require產生致命錯誤並停止執行,3)include_once和require_once防止重複包含。這些函數的選擇取決於文件的重要性和是否需要防止重複包含,合理使用可以提高代碼的可讀性和可維護性。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7
