One of the problem of PHP as a OOP language is, the fact that you can only have single inheritance. This means your class can only inherit from one other class.
PHP Traits (new feature was added in PHP 5.4) is kind of like a Mixin, allows you to mix Trait classes into an existing class. This means you can reduce code duplication and get the benefits whilst avoiding the problems of multiple inheritance.
As per the PHP Documentation, a Trait is intended to reduce some limitations of single inheritance by enabling a developer to reuse sets of methods freely in several independent classes living in different class hierarchies. The semantics of the combination of Traits and classes is defined in a way which reduces complexity, and avoids the typical problems associated with multiple inheritance and Mixins.
A Trait is similar to a class, but only intended to group functionality in a fine-grained and consistent way. It is not possible to instantiate a Trait on its own. It is an addition to traditional inheritance and enables horizontal composition of behavior; that is, the application of class members without requiring inheritance.
Let’s take some example to make more clear about Traits.
A trait is similar to an abstract class which cannot be instantiated on its own (though more often it’s compared to an interface).
<?php trait Helloworld { private $message; function sayHello() { echo "Hello"; } function sayWorld() { echo "World"; } abstract function define(); } ?>
It can have functions, data members, abstract function etc same as class you have.
PHP have some set of rules defined to use Traits in his best way like Precedence, Use of Multiple Traits, Conflict Resolution, Method Visibility etc.
To understand the Traits and how these can be used to make your life easy, I have googled and found some very good example/posts with explanation that will really help you.
One is PHP Documents itself (Bible for all PHP Developers)
http://php.net/manual/en/language.oop5.traits.php
Second one is found on SitePoint
http://www.sitepoint.com/using-traits-in-php-5-4/
Hope these will helps!!
Benefits of Traits
- Traits reduce your code duplication whilst preventing complicated class inheritance that might not make sense within the context of your application.
- It allows you to define simple clear and concise code and then mix in that functionality wherever needed.
- It somehow reduce the situation as generally possible in the multiple inheritance supporting languages called as “Diamond Problem“.
Drawbacks of Traits
- Entire class abilities are NOT in one location visually.
- You alter the trait thinking it will alter one type of class using it, but may introduce problems in another class also using it. Meaning you will have to know all classes using the trait.
- Introduces the idea of multiple inheritance, which bring with it the need to worry about conflicts in naming. (Yes you can solve it using insteadof, but now you have to worry about that and take precautions like specific naming related to the trait or to use this keyword).
Conclusion
So now after have a look on all features and benefits and drawback now a question is, Should you use Traits?
You should, as Traits allow you to create cleaner, simpler, and more efficient code fragments horizontally across multiple classes which do not have to be within the same inheritance hierarchy.
As a developer we have some bad or good situation for all code and logic, so it is your choice how will you play with Traits?