<?xml version="1.0"?>
<oembed><version>1.0</version><provider_name>Mark's Blog</provider_name><provider_url>https://dangnh.cf/vi</provider_url><author_name>admin</author_name><author_url>https://dangnh.cf/vi/author/admin/</author_url><title>Trait &#x2013; Mixin in PHP? - PART 2 - Mark's Blog</title><type>rich</type><width>600</width><height>338</height><html>&lt;blockquote class="wp-embedded-content" data-secret="CYmBexsLEl"&gt;&lt;a href="https://dangnh.cf/vi/2025/05/19/trait-mixin-in-php-part-2/"&gt;Trait &#x2013; Mixin in PHP? &#x2013; PART 2&lt;/a&gt;&lt;/blockquote&gt;&lt;iframe sandbox="allow-scripts" security="restricted" src="https://dangnh.cf/vi/2025/05/19/trait-mixin-in-php-part-2/embed/#?secret=CYmBexsLEl" width="600" height="338" title="&#x201C;Trait &#x2013; Mixin in PHP? &#x2013; PART 2&#x201D; &#x2014; Mark's Blog" data-secret="CYmBexsLEl" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" class="wp-embedded-content"&gt;&lt;/iframe&gt;&lt;script type="text/javascript"&gt;
/* &lt;![CDATA[ */
/*! This file is auto-generated */
!function(d,l){"use strict";l.querySelector&amp;&amp;d.addEventListener&amp;&amp;"undefined"!=typeof URL&amp;&amp;(d.wp=d.wp||{},d.wp.receiveEmbedMessage||(d.wp.receiveEmbedMessage=function(e){var t=e.data;if((t||t.secret||t.message||t.value)&amp;&amp;!/[^a-zA-Z0-9]/.test(t.secret)){for(var s,r,n,a=l.querySelectorAll('iframe[data-secret="'+t.secret+'"]'),o=l.querySelectorAll('blockquote[data-secret="'+t.secret+'"]'),c=new RegExp("^https?:$","i"),i=0;i&lt;o.length;i++)o[i].style.display="none";for(i=0;i&lt;a.length;i++)s=a[i],e.source===s.contentWindow&amp;&amp;(s.removeAttribute("style"),"height"===t.message?(1e3&lt;(r=parseInt(t.value,10))?r=1e3:~~r&lt;200&amp;&amp;(r=200),s.height=r):"link"===t.message&amp;&amp;(r=new URL(s.getAttribute("src")),n=new URL(t.value),c.test(n.protocol))&amp;&amp;n.host===r.host&amp;&amp;l.activeElement===s&amp;&amp;(d.top.location.href=t.value))}},d.addEventListener("message",d.wp.receiveEmbedMessage,!1),l.addEventListener("DOMContentLoaded",function(){for(var e,t,s=l.querySelectorAll("iframe.wp-embedded-content"),r=0;r&lt;s.length;r++)(t=(e=s[r]).getAttribute("data-secret"))||(t=Math.random().toString(36).substring(2,12),e.src+="#?secret="+t,e.setAttribute("data-secret",t)),e.contentWindow.postMessage({message:"ready",secret:t},"*")},!1)))}(window,document);
//# sourceURL=https://dangnh.cf/wp-includes/js/wp-embed.min.js
/* ]]&gt; */
&lt;/script&gt;</html><thumbnail_url>https://i0.wp.com/dangnh.cf/wp-content/uploads/2018/06/retro-background-3101430_960_720.jpg?fit=960%2C540&amp;ssl=1</thumbnail_url><thumbnail_width>960</thumbnail_width><thumbnail_height>540</thumbnail_height><description>D&#x1B0;&#x1EDB;i &#x111;&#xE2;y l&#xE0; ph&#x1EA7;n 2 (v&#xE0; c&#x169;ng l&#xE0; ph&#x1EA7;n cu&#x1ED1;i) c&#x1EE7;a series &#x201C;Trait &#x2013; Mixin trong PHP&#x201D;. &#x1EDE; ph&#x1EA7;n n&#xE0;y ch&#xFA;ng ta s&#x1EBD; &#x111;i s&#xE2;u v&#xE0;o c&#xE1;ch x&#x1EED; l&#xFD; xung &#x111;&#x1ED9;t, m&#x1EDF; r&#x1ED9;ng kh&#x1EA3; n&#x103;ng c&#x1EE7;a Trait v&#xE0; c&#xE1;c v&#xED; d&#x1EE5; th&#x1EF1;c ti&#x1EC5;n. M&#x1EDD;i c&#xE1;c b&#x1EA1;n xem l&#x1EA1;i ph&#x1EA7;n 1 t&#x1EA1;i &#x111;&#xE2;y: https://dangnh.cf/2018/06/01/trait-mixin-in-php/ 1. Gi&#x1EA3;i quy&#x1EBF;t xung &#x111;&#x1ED9;t gi&#x1EEF;a c&#xE1;c Trait Khi m&#x1ED9;t class use nhi&#x1EC1;u trait v&#xE0; c&#xF3; ph&#x1B0;&#x1A1;ng th&#x1EE9;c tr&#xF9;ng t&#xEA;n, PHP s&#x1EBD; b&#xE1;o l&#x1ED7;i. &#x110;&#x1EC3; tr&#xE1;nh, ta d&#xF9;ng hai t&#x1EEB; kh&#xF3;a: 1.1. insteadof Ch&#x1ECD;n ph&#x1B0;&#x1A1;ng th&#x1EE9;c c&#x1EE7;a trait n&#xE0;y thay v&#xEC; c&#x1EE7;a trait kia: 1.2. as &#x110;&#x1ED5;i t&#xEA;n (alias) cho ph&#x1B0;&#x1A1;ng th&#x1EE9;c &#x111;&#x1EC3; v&#x1EAB;n c&#xF3; th&#x1EC3; g&#x1ECD;i c&#x1EA3; hai: 2. C&#xE1;c t&#xED;nh n&#x103;ng n&#xE2;ng cao c&#x1EE7;a Trait 2.1. Abstract method trong Trait B&#x1EA1;n c&#xF3; th&#x1EC3; khai b&#xE1;o ph&#x1B0;&#x1A1;ng th&#x1EE9;c abstract trong trait, bu&#x1ED9;c class k&#x1EBF; th&#x1EEB;a ph&#x1EA3;i tri&#x1EC3;n khai: 2.2. Trait v&#x1EDB;i thu&#x1ED9;c t&#xED;nh static v&#xE0;&#xA0;const Trait cho ph&#xE9;p &#x111;&#x1ECB;nh ngh&#x129;a static property v&#xE0; const: 2.3. Thu&#x1ED9;c t&#xED;nh v&#xE0; ph&#x1B0;&#x1A1;ng th&#x1EE9;c private/protected Trait c&#xF3; th&#x1EC3; khai b&#xE1;o method private hay protected, ch&#x1EC9; class ch&#x1EE9;a trait bi&#x1EBF;t d&#xF9;ng: 2.4. Trait th&#x1EEB;a k&#x1EBF; Trait Trait c&#x169;ng c&#xF3; th&#x1EC3; use trait kh&#xE1;c: 3. V&#xED; d&#x1EE5; th&#x1EF1;c t&#x1EBF; 3.1. Trait &#x201C;SoftDelete&#x201D; cho Model Gi&#x1EDD; ch&#x1EC9; c&#x1EA7;n use SoftDelete, m&#x1ECD;i class &#x111;&#x1EC1;u c&#xF3; t&#xED;nh n&#x103;ng x&#xF3;a m&#x1EC1;m. 3.2. Trait &#x201C;Timestampable&#x201D; T&#x1EF1; &#x111;&#x1ED9;ng qu&#x1EA3;n l&#xFD; created_at/updated_at: 4. Best Practices khi d&#xF9;ng Trait Gi&#x1EEF; trait nh&#x1ECF;, chuy&#xEA;n bi&#x1EC7;t: M&#x1ED7;i trait ch&#x1EC9; &#x111;&#x1EA3;m nh&#x1EAD;n m&#x1ED9;t nhi&#x1EC7;m v&#x1EE5; duy nh&#x1EA5;t. &#x110;&#x1EB7;t t&#xEA;n r&#xF5; r&#xE0;ng: V&#xED; d&#x1EE5; Loggable, Notifiable, SoftDeleteable&#x2026; Tr&#xE1;nh trait qu&#xE1; &#x201C;n&#x1EB7;ng&#x201D;: N&#x1EBF;u trait ch&#x1EE9;a qu&#xE1; nhi&#x1EC1;u logic, c&#xE2;n nh&#x1EAF;c t&#xE1;ch th&#xE0;nh class helper ho&#x1EB7;c service. T&#xE0;i li&#x1EC7;u &#x111;&#x1EA7;y &#x111;&#x1EE7;: Khai b&#xE1;o @method hay @property trong DocBlock n&#x1EBF;u trait &#x201C;inject&#x201D; th&#xEA;m method hay property cho IDE. 5. K&#x1EBF;t lu&#x1EAD;n Trait l&#xE0; c&#xF4;ng c&#x1EE5; m&#x1EA1;nh m&#x1EBD; gi&#xFA;p t&#xE1;i s&#x1EED; d&#x1EE5;ng code v&#xE0; &#x201C;mixin&#x201D; behavior v&#xE0;o nhi&#x1EC1;u class kh&#xE1;c nhau m&#xE0; kh&#xF4;ng c&#x1EA7;n &#x111;a k&#x1EBF; th&#x1EEB;a. Tuy nhi&#xEA;n, l&#x1EA1;m d&#x1EE5;ng qu&#xE1; nhi&#x1EC1;u trait c&#xF3; th&#x1EC3; l&#xE0;m code r&#x1ED1;i v&#xE0; kh&#xF3; theo d&#xF5;i. H&#xE3;y thi&#x1EBF;t k&#x1EBF; trait g&#x1ECD;n, r&#xF5; r&#xE0;ng, v&#xE0; &#xE1;p d&#x1EE5;ng cho nh&#x1EEF;ng h&#xE0;m th&#x1EF1;c s&#x1EF1; chung nh&#x1EA5;t. C&#x1EA3;m &#x1A1;n b&#x1EA1;n &#x111;&#xE3; theo d&#xF5;i series v&#x1EC1; Trait trong PHP. Ch&#xFA;c c&#xE1;c b&#x1EA1;n &#xE1;p d&#x1EE5;ng hi&#x1EC7;u qu&#x1EA3; v&#xE0; happy coding! &nbsp; T&#xE0;i li&#x1EC7;u li&#xEA;n quan: PHP Manual &#x2013; Traits: https://www.php.net/manual/en/language.oop5.traits.php&#xA0; PHP Manual &#x2013; Conflict Resolution: https://www.php.net/manual/en/language.oop5.traits.php#traits.conflict.resolution</description></oembed>
