Traits in PHP and Laravel?

This is a fact that in PHP you can only have single inheritance. That means a class can inherit from only one other class. For example if a class needs to inherit more than one methods from different classes in order to prevent duplication of the code, it can’t extend multiple classes.

It is not possible in versions < PHP 5.4, but in PHP 5.4 a new feature was added known as Traits and is used effectively in Laravel.

I have created a Traits folder in my app/Http in Laravel project with a Trait called ActivityLog.php. Let’s take a look at very simple example how to implement Traits:

ActivityLog.php

<?php
use App\Http\Traits\ActivityLog;

trait ActivityLog {
    public function log($message, $object) {
        // Store $message and $object in database
        SomeModel::create([
            'message' => $message,
            'object_class' = get_class($object),
            'user_id' => Auth::user()->id
        ]);
    }
}

Implementation of trait in our models:

Product.php

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model {
	use ActivityLog;
}

Stock.php

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class Stock {
	use ActivityLog;
}

How to access trait implemented in Models?

ProductController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Product;

class ProductController extends Controller
{
    /**
     * Store a new product.
     *
     * @param  Request  $request
     * @return Response
     */
	public function store(Request $request) {
		$product = new Product();
		$product->create($payload);
		$product->storeLog('product is created', $product);
	}
		
}

On the other hand, how to implement trait in Controller instead of Model:

StockController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Product;

class StockController extends Controller
{
	use ActivityLog;

	public function store(Request $request) {
		$product->update($payload);
		$this->storeLog('product is updated', $product);
	}

}

Get Gist of code examples here.

Quite simple, isn’t it. I never used this feature of PHP before I started to code in Laravel. Really a useful feature to reduce code duplication.

About the author

Danyal Ali Butt

I'm working as programmer since 2002. Born, grew up, studied and worked in Pakistan now Im located in Denmark since 2006.

View all posts