{"id":107,"date":"2021-03-08T00:20:52","date_gmt":"2021-03-08T00:20:52","guid":{"rendered":"https:\/\/phptutorial.net\/?page_id=107"},"modified":"2025-04-07T11:30:07","modified_gmt":"2025-04-07T11:30:07","slug":"php-traits","status":"publish","type":"page","link":"https:\/\/www.phptutorial.net\/php-oop\/php-traits\/","title":{"rendered":"PHP Traits"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you will learn how to use <strong>PHP traits<\/strong> to share functionality across independent classes, which are not in the same inheritance hierarchy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='introduction-to-php-traits'>Introduction to PHP traits <a href=\"#introduction-to-php-traits\" class=\"anchor\" id=\"introduction-to-php-traits\" title=\"Anchor for Introduction to PHP traits\">#<\/a><\/h2>\n\n\n\n<p>Code reuse is one of the most important aspects of object-oriented programming. In PHP, you use <a href=\"https:\/\/phptutorial.net\/php-oop\/php-inheritance\/\">inheritance <\/a>to enable code reuse in different classes with the same inheritance hierarchy. <\/p>\n\n\n\n<p>To achieve code reuse, you move the common functionality of classes to methods of the parent class. However, inheritance makes the code very tightly coupled. Therefore, overuse of inheritance may cause the code very hard to maintain.<\/p>\n\n\n\n<p>To overcome this problem, PHP 5.4 introduced a new reusable unit of code called <code>trait<\/code><em>.<\/em> Traits allow you to reuse various methods freely in many different classes that do not need to be in the same class hierarchy.<\/p>\n\n\n\n<p>Inheritance allows classes to reuse the code vertically while the traits allow classes reuse the code horizontally.<\/p>\n\n\n\n<p>A trait is similar to a <a href=\"https:\/\/phptutorial.net\/php-oop\/php-objects\/\">class, <\/a>but it is only for grouping methods in a fine-grained and consistent way. PHP does not allow you to create an instance of a Trait like an instance of a class. And there is no such concept of an instance of a trait.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='php-trait-example'>PHP Trait example <a href=\"#php-trait-example\" class=\"anchor\" id=\"php-trait-example\" title=\"Anchor for PHP Trait example\">#<\/a><\/h2>\n\n\n\n<p>To define a trait, you use the trait keyword followed by a name as follows:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">trait<\/span> Logger\n{\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">($msg)<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'&lt;pre&gt;'<\/span>;\n\t\t<span class=\"hljs-keyword\">echo<\/span> date(<span class=\"hljs-string\">'Y-m-d h:i:s'<\/span>) . <span class=\"hljs-string\">':'<\/span> . <span class=\"hljs-string\">'('<\/span> . <span class=\"hljs-keyword\">__CLASS__<\/span> . <span class=\"hljs-string\">') '<\/span> . $msg . <span class=\"hljs-string\">'&lt;br\/&gt;'<\/span>;\n\t\t<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'&lt;\/pre&gt;'<\/span>;\n\t}\n}\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>To use a trait in a class, you use the <code>use<\/code> keyword. All the trait&#8217;s methods are available in the class where it is used. Calling a method of a trait is similar to calling an instance method.<\/p>\n\n\n\n<p>The following example demonstrates how to use the <code>Logger<\/code> trait in the <code>BankAccount<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BankAccount<\/span>\n<\/span>{\n\t<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Logger<\/span>;\n\n\t<span class=\"hljs-keyword\">private<\/span> $accountNumber;\n\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">($accountNumber)<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;accountNumber = $accountNumber;\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;log(<span class=\"hljs-string\">\"A new $accountNumber bank account created\"<\/span>);\n\t}\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>And you can reuse the <code>Logger<\/code> trait in the <code>User<\/code> class as follows:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">User<\/span>\n<\/span>{\n\t<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Logger<\/span>;\n\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">__construct<\/span><span class=\"hljs-params\">()<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;log(<span class=\"hljs-string\">'A new user created'<\/span>);\n\t}\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Both <code>BankAccount<\/code> and <code>User<\/code> classes reuse methods of the <code>Logger<\/code> trait, which is very flexible.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='using-multiple-traits'>Using multiple traits <a href=\"#using-multiple-traits\" class=\"anchor\" id=\"using-multiple-traits\" title=\"Anchor for Using multiple traits\">#<\/a><\/h2>\n\n\n\n<p>A class can use multiple traits. The following example demonstrates how to use multiple traits in the IDE class. It simulates the C compilation model in PHP for the sake of demonstration.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">trait<\/span> Preprocessor\n{\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">preprocess<\/span><span class=\"hljs-params\">()<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'Preprocess...done'<\/span> . <span class=\"hljs-string\">'&lt;br\/&gt;'<\/span>;\n\t}\n}\n<span class=\"hljs-keyword\">trait<\/span> Compiler\n{\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">compile<\/span><span class=\"hljs-params\">()<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'Compile code... done'<\/span> . <span class=\"hljs-string\">'&lt;br\/&gt;'<\/span>;\n\t}\n}\n\n<span class=\"hljs-keyword\">trait<\/span> Assembler\n{\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">createObjCode<\/span><span class=\"hljs-params\">()<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'Create the object code files... done.'<\/span> . <span class=\"hljs-string\">'&lt;br\/&gt;'<\/span>;\n\t}\n}\n\n<span class=\"hljs-keyword\">trait<\/span> Linker\n{\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">createExec<\/span><span class=\"hljs-params\">()<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'Create the executable file...done'<\/span> . <span class=\"hljs-string\">'&lt;br\/&gt;'<\/span>;\n\t}\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">IDE<\/span>\n<\/span>{\n\t<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Preprocessor<\/span>, <span class=\"hljs-title\">Compiler<\/span>, <span class=\"hljs-title\">Assembler<\/span>, <span class=\"hljs-title\">Linker<\/span>;\n\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">run<\/span><span class=\"hljs-params\">()<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;preprocess();\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;compile();\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;createObjCode();\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;createExec();\n\n\t\t<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'Execute the file...done'<\/span> . <span class=\"hljs-string\">'&lt;br\/&gt;'<\/span>;\n\t}\n}\n\n$ide = <span class=\"hljs-keyword\">new<\/span> IDE();\n$ide-&gt;run();\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><a href=\"https:\/\/phptutorial.net\/playground\/?q=PD9waHAKCnRyYWl0IFByZXByb2Nlc3Nvcgp7CglwdWJsaWMgZnVuY3Rpb24gcHJlcHJvY2VzcygpCgl7CgkJZWNobyAnUHJlcHJvY2Vzcy4uLmRvbmUnIC4gJzxici8-JzsKCX0KfQp0cmFpdCBDb21waWxlcgp7CglwdWJsaWMgZnVuY3Rpb24gY29tcGlsZSgpCgl7CgkJZWNobyAnQ29tcGlsZSBjb2RlLi4uIGRvbmUnIC4gJzxici8-JzsKCX0KfQoKdHJhaXQgQXNzZW1ibGVyCnsKCXB1YmxpYyBmdW5jdGlvbiBjcmVhdGVPYmpDb2RlKCkKCXsKCQllY2hvICdDcmVhdGUgdGhlIG9iamVjdCBjb2RlIGZpbGVzLi4uIGRvbmUuJyAuICc8YnIvPic7Cgl9Cn0KCnRyYWl0IExpbmtlcgp7CglwdWJsaWMgZnVuY3Rpb24gY3JlYXRlRXhlYygpCgl7CgkJZWNobyAnQ3JlYXRlIHRoZSBleGVjdXRhYmxlIGZpbGUuLi5kb25lJyAuICc8YnIvPic7Cgl9Cn0KCmNsYXNzIElERQp7Cgl1c2UgUHJlcHJvY2Vzc29yLCBDb21waWxlciwgQXNzZW1ibGVyLCBMaW5rZXI7CgoJcHVibGljIGZ1bmN0aW9uIHJ1bigpCgl7CgkJJHRoaXMtPnByZXByb2Nlc3MoKTsKCQkkdGhpcy0-Y29tcGlsZSgpOwoJCSR0aGlzLT5jcmVhdGVPYmpDb2RlKCk7CgkJJHRoaXMtPmNyZWF0ZUV4ZWMoKTsKCgkJZWNobyAnRXhlY3V0ZSB0aGUgZmlsZS4uLmRvbmUnIC4gJzxici8-JzsKCX0KfQoKJGlkZSA9IG5ldyBJREUoKTsKJGlkZS0-cnVuKCk7\" target=\"_blank\" rel=\"noreferrer noopener\">Try it<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id='composing-multiple-traits'>Composing multiple traits <a href=\"#composing-multiple-traits\" class=\"anchor\" id=\"composing-multiple-traits\" title=\"Anchor for Composing multiple traits\">#<\/a><\/h2>\n\n\n\n<p>PHP allows you to compose multiple traits into a trait by using the <code>use<\/code> statement in the trait&#8217;s declaration. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">trait<\/span> Reader\n{\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">read<\/span><span class=\"hljs-params\">($source)<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">echo<\/span> sprintf(<span class=\"hljs-string\">'Read from %s &lt;br&gt;'<\/span>, $source);\n\t}\n}\n\n<span class=\"hljs-keyword\">trait<\/span> Writer\n{\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">write<\/span><span class=\"hljs-params\">($destination)<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">echo<\/span> sprintf(<span class=\"hljs-string\">'Write to %s &lt;br&gt;'<\/span>, $destination);\n\t}\n}\n\n<span class=\"hljs-keyword\">trait<\/span> Copier\n{\n\t<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Reader<\/span>, <span class=\"hljs-title\">Writer<\/span>;\n\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">copy<\/span><span class=\"hljs-params\">($source, $destination)<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;read($source);\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;write($destination);\n\t}\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FileUtil<\/span>\n<\/span>{\n\t<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">Copier<\/span>;\n\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">copyFile<\/span><span class=\"hljs-params\">($source, $destination)<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">$this<\/span>-&gt;copy($source, $destination);\n\t}\n}\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>First, define <code>Reader<\/code> and <code>Writer<\/code> traits.<\/li>\n\n\n\n<li>Second, define a new trait called <code>Copier<\/code> that is composed of <code>Reader <\/code>and <code>Writer<\/code> traits. In the <code>copy()<\/code> method\u00a0of the <code>Copier<\/code> trait, call the\u00a0 <code>read()<\/code> and <code>write()<\/code> methods of the <code>Reader<\/code> and <code>Writer<\/code> traits.<\/li>\n\n\n\n<li>Third, use the <code>Copier<\/code> trait in the\u00a0 <code>copyFile()<\/code> method\u00a0of the <code>FileUtil<\/code> class to simulate the file copy.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id='php-traits-method-conflict-resolution'>PHP trait&#8217;s method conflict resolution <a href=\"#php-traits-method-conflict-resolution\" class=\"anchor\" id=\"php-traits-method-conflict-resolution\" title=\"Anchor for PHP trait&#039;s method conflict resolution\">#<\/a><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id='overriding-trait-method'>Overriding trait method <a href=\"#overriding-trait-method\" class=\"anchor\" id=\"overriding-trait-method\" title=\"Anchor for Overriding trait method\">#<\/a><\/h3>\n\n\n\n<p>When a class uses multiple traits that share the same method name, PHP will raise a fatal error.&nbsp;<\/p>\n\n\n\n<p>Fortunately, you can instruct PHP to use the method by using the <code>inteadof<\/code> keyword. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"php\"><span class=\"hljs-meta\">&lt;?php<\/span>\n\n<span class=\"hljs-keyword\">trait<\/span> FileLogger\n{\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">($msg)<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'File Logger '<\/span> . date(<span class=\"hljs-string\">'Y-m-d h:i:s'<\/span>) . <span class=\"hljs-string\">':'<\/span> . $msg . <span class=\"hljs-string\">'&lt;br\/&gt;'<\/span>;\n\t}\n}\n\n<span class=\"hljs-keyword\">trait<\/span> DatabaseLogger\n{\n\t<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">($msg)<\/span>\n\t<\/span>{\n\t\t<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'Database Logger '<\/span> . date(<span class=\"hljs-string\">'Y-m-d h:i:s'<\/span>) . <span class=\"hljs-string\">':'<\/span> . $msg . <span class=\"hljs-string\">'&lt;br\/&gt;'<\/span>;\n\t}\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Logger<\/span>\n<\/span>{\n\t<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">FileLogger<\/span>, <span class=\"hljs-title\">DatabaseLogger<\/span>{\n\t\t<span class=\"hljs-title\">FileLogger<\/span>::<span class=\"hljs-title\">log<\/span> <span class=\"hljs-title\">insteadof<\/span> <span class=\"hljs-title\">DatabaseLogger<\/span>;\n\t}\n}\n\n$logger = <span class=\"hljs-keyword\">new<\/span> Logger();\n$logger-&gt;log(<span class=\"hljs-string\">'this is a test message #1'<\/span>);\n$logger-&gt;log(<span class=\"hljs-string\">'this is a test message #2'<\/span>);\n<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><a href=\"https:\/\/phptutorial.net\/playground\/?q=PD9waHAKCnRyYWl0IEZpbGVMb2dnZXIKewoJcHVibGljIGZ1bmN0aW9uIGxvZygkbXNnKQoJewoJCWVjaG8gJ0ZpbGUgTG9nZ2VyICcgLiBkYXRlKCdZLW0tZCBoOmk6cycpIC4gJzonIC4gJG1zZyAuICc8YnIvPic7Cgl9Cn0KCnRyYWl0IERhdGFiYXNlTG9nZ2VyCnsKCXB1YmxpYyBmdW5jdGlvbiBsb2coJG1zZykKCXsKCQllY2hvICdEYXRhYmFzZSBMb2dnZXIgJyAuIGRhdGUoJ1ktbS1kIGg6aTpzJykgLiAnOicgLiAkbXNnIC4gJzxici8-JzsKCX0KfQoKY2xhc3MgTG9nZ2VyCnsKCXVzZSBGaWxlTG9nZ2VyLCBEYXRhYmFzZUxvZ2dlcnsKCQlGaWxlTG9nZ2VyOjpsb2cgaW5zdGVhZG9mIERhdGFiYXNlTG9nZ2VyOwoJfQp9CgokbG9nZ2VyID0gbmV3IExvZ2dlcigpOwokbG9nZ2VyLT5sb2coJ3RoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgIzEnKTsKJGxvZ2dlci0-bG9nKCd0aGlzIGlzIGEgdGVzdCBtZXNzYWdlICMyJyk7\" target=\"_blank\" rel=\"noreferrer noopener\">Try it<\/a><\/p>\n\n\n\n<p>Both <code>FileLogger<\/code> and <code>DatabaseLogger<\/code> traits have the same&nbsp; <code>log()<\/code> method. <\/p>\n\n\n\n<p>In the <code>Logger<\/code> class, we resolved the method name conflict by specifying that the&nbsp; <code>log()<\/code> method of the <code>FileLogger<\/code> trait will be used instead of the <code>DatabaseLogger<\/code>&#8216;s.<\/p>\n\n\n\n<p>What if you want to use both <code>log()<\/code> methods from the <code>FileLogger<\/code> and <code>DatabaseLogger<\/code> traits? if so, you can use an alias for the method of the trait within the class that uses the trait.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id='aliasing-trait-method'>Aliasing trait method <a href=\"#aliasing-trait-method\" class=\"anchor\" id=\"aliasing-trait-method\" title=\"Anchor for Aliasing trait method\">#<\/a><\/h3>\n\n\n\n<p>By using aliases for the same method name of multiple traits, you can reuse all the methods in those traits. <\/p>\n\n\n\n<p>You use the <code>as<\/code> keyword to alias a method of a trait to a different name within the class that uses the trait. <\/p>\n\n\n\n<p>The following example illustrates how to alias trait method to resolve the method name conflict:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Logger<\/span>\n<\/span>{\n\t<span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">FileLogger<\/span>, <span class=\"hljs-title\">DatabaseLogger<\/span>{\n\t\t<span class=\"hljs-title\">DatabaseLogger<\/span>::<span class=\"hljs-title\">log<\/span> <span class=\"hljs-title\">as<\/span> <span class=\"hljs-title\">logToDatabase<\/span>;\n\t\tFileLogger::log <span class=\"hljs-keyword\">insteadof<\/span> DatabaseLogger;\n\t}\n}\n\n$logger = <span class=\"hljs-keyword\">new<\/span> Logger();\n$logger-&gt;log(<span class=\"hljs-string\">'this is a test message #1'<\/span>);\n$logger-&gt;logToDatabase(<span class=\"hljs-string\">'this is a test message #2'<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><a href=\"https:\/\/phptutorial.net\/playground\/?q=PD9waHAKCnRyYWl0IEZpbGVMb2dnZXIKewoJcHVibGljIGZ1bmN0aW9uIGxvZygkbXNnKQoJewoJCWVjaG8gJ0ZpbGUgTG9nZ2VyICcgLiBkYXRlKCdZLW0tZCBoOmk6cycpIC4gJzonIC4gJG1zZyAuICc8YnIvPic7Cgl9Cn0KCnRyYWl0IERhdGFiYXNlTG9nZ2VyCnsKCXB1YmxpYyBmdW5jdGlvbiBsb2coJG1zZykKCXsKCQllY2hvICdEYXRhYmFzZSBMb2dnZXIgJyAuIGRhdGUoJ1ktbS1kIGg6aTpzJykgLiAnOicgLiAkbXNnIC4gJzxici8-JzsKCX0KfQoKCgpjbGFzcyBMb2dnZXIKewoJdXNlIEZpbGVMb2dnZXIsIERhdGFiYXNlTG9nZ2VyewoJCURhdGFiYXNlTG9nZ2VyOjpsb2cgYXMgbG9nVG9EYXRhYmFzZTsKCQlGaWxlTG9nZ2VyOjpsb2cgaW5zdGVhZG9mIERhdGFiYXNlTG9nZ2VyOwoJfQp9CgokbG9nZ2VyID0gbmV3IExvZ2dlcigpOwokbG9nZ2VyLT5sb2coJ3RoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgIzEnKTsKJGxvZ2dlci0-bG9nVG9EYXRhYmFzZSgndGhpcyBpcyBhIHRlc3QgbWVzc2FnZSAjMicpOw\" target=\"_blank\" rel=\"noreferrer noopener\">Try it<\/a><\/p>\n\n\n\n<p>The method&nbsp; <code>log()<\/code> of the <code>DatabaseLogger<\/code> class has a new name ( <code>logToDatabase<\/code>) &nbsp;in the context of the <code>Logger <\/code>class.<\/p>\n\n\n\n<p>In this tutorial, you have learned how to use PHP traits to reuse the code outside of a class hierarchy.<\/p>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Did you find this tutorial useful?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"107\"\n\t\t\t\tdata-post-url=\"https:\/\/www.phptutorial.net\/php-oop\/php-traits\/\"\n\t\t\t\tdata-post-title=\"PHP Traits\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"107\"\n\t\t\t\tdata-post-url=\"https:\/\/www.phptutorial.net\/php-oop\/php-traits\/\"\n\t\t\t\tdata-post-title=\"PHP Traits\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Summary: in this tutorial, you will learn how to use PHP traits to share functionality across independent classes, which are not in the same inheritance hierarchy. Introduction to PHP traits # Code reuse is one of the most important aspects of object-oriented programming. In PHP, you use inheritance to enable code reuse in different classes [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1753,"menu_order":14,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-107","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages\/107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/comments?post=107"}],"version-history":[{"count":5,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages\/107\/revisions"}],"predecessor-version":[{"id":3231,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages\/107\/revisions\/3231"}],"up":[{"embeddable":true,"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/pages\/1753"}],"wp:attachment":[{"href":"https:\/\/www.phptutorial.net\/wp-json\/wp\/v2\/media?parent=107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}