Web Development Handbook

Web Development Handbook

Development is fun in a funny way

What is the difference between Trait and Class

What is the difference between Trait and Class

0 votes
0 votes

By Nihar Ranjan Das, Published on May 12th 2023 | 7 mins, 674 words

In PHP, both traits and classes are used for code reuse and organization, but they serve different purposes.

A class is a blueprint for creating objects. It defines properties (variables) and methods (functions) that describe the behavior and characteristics of the objects created from it. Classes are used for creating instances and encapsulating related data and functionality.

A trait, on the other hand, is a mechanism for code reuse in PHP that enables the composition of methods into classes. It is similar to a class in that it can contain methods, but it cannot be instantiated directly. Traits are designed to reduce code duplication by allowing you to reuse sets of methods in multiple classes. You can think of traits as horizontal code reuse, as they can be "mixed in" to multiple classes.

Here are some key differences between traits and classes:

  1. Instantiation: Classes can be instantiated to create objects, while traits cannot be instantiated directly. Traits are used to provide reusable methods that can be incorporated into classes.
  2. Inheritance: Classes support inheritance, allowing one class to extend another class and inherit its properties and methods. Traits, on the other hand, do not support inheritance. They are intended to be used as a form of code composition, allowing multiple traits to be combined into a single class.
  3. Single inheritance vs. multiple trait composition: In PHP, a class can only inherit from one parent class, but it can use multiple traits. This allows for more flexible code reuse when compared to classes alone.
  4. State management: Classes can have properties that hold state, which can be unique to each object instance. Traits, being just a collection of methods, cannot directly define properties or manage state. However, they can utilize properties defined in the classes they are used in.

To summarize, classes are used for creating objects and encapsulating related data and behavior, while traits are used for code reuse by incorporating reusable sets of methods into classes. Classes support inheritance, whereas traits enable multiple trait composition.

Let's start with an example of a class. Suppose we have a class called Car that represents a car object with properties and methods:

class Car {
    private $brand;
    private $color;
    public function __construct($brand, $color) {
        $this->brand = $brand;
        $this->color = $color;
    public function startEngine() {
        echo "The {$this->brand} car with color {$this->color} is starting the engine.";
    public function drive() {
        echo "The {$this->brand} car with color {$this->color} is driving.";

In this example, the Car class has properties $brand and $color, and two methods startEngine() and drive(). We can create instances of the Car class and call its methods:

$myCar = new Car('Toyota', 'blue');
$myCar->startEngine();  // Output: The Toyota car with color blue is starting the engine.
$myCar->drive();        // Output: The Toyota car with color blue is driving.

Now, let's consider an example of a trait. Suppose we have a trait called GpsTrait that provides GPS functionality to classes that use it:

trait GpsTrait {
    public function enableGps() {
        echo "GPS is enabled.";
    public function getCoordinates() {
        echo "Getting current coordinates.";

The GpsTrait trait contains two methods, enableGps() and getCoordinates(), which can be reused by other classes. To use this trait, we can define a class and include the trait using the use keyword:

class NavigationSystem {
    use GpsTrait;
    public function calculateRoute() {
        echo "Calculating the route based on GPS coordinates.";

In this example, the NavigationSystem class includes the GpsTrait using the use keyword. Now, objects of the NavigationSystem class can access the methods defined in the trait as well as its own methods:

$navigation = new NavigationSystem();
$navigation->enableGps();     // Output: GPS is enabled.
$navigation->getCoordinates(); // Output: Getting current coordinates.
$navigation->calculateRoute(); // Output: Calculating the route based on GPS coordinates.

By including the GpsTrait in the NavigationSystem class, we have reused the methods defined in the trait without duplicating the code.

It's important to note that traits can be included in multiple classes, allowing for code reuse across different class hierarchies. This flexibility makes traits a powerful tool for horizontal code reuse in PHP.

If you like our tutorial, do make sure to support us by buy us a coffee ☕️


Default avatar

Are you interested to learn more?

Be notified on future content. Never spam.