PHP 5.4 introduced a technique called traits. This technique aims to provide code re-usability functionality similar to mixins in other programming languages. The most common use case is to reuse methods among different classes.

Here is an example of the syntax;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
trait someMath
{
    function add($a, $b)
    {
        return $a + $b;
    }

    function multiply($a, $b)
    {
        return $a * $b;
    }
}

class Calculator
{
    use someMath;
}

$cal = new Calculator();
echo $cal->add(4, 6); // echoes 10

As you can see traits syntax is very similar to the syntax to create a class. We just need to change the keyword class for trait. Then we can apply the trait inside a class using the use keyword.

Precedence

Method collisions are resolved in this order of precedence:

  • Defined on the class
  • Defined on trait
  • Defined on parent class

The topmost in the list is the method that will be used when called from an instance. Lets see an example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
trait someMath
{
    function add($a, $b)
    {
        return $a + $b;
    }

    function multiply($a, $b)
    {
        return $a * $b;
    }
}

class Calculator
{
    function subtract($a, $b)
    {
        return $a - $b;
    }

    function multiply($a, $b)
    {
        return $a * $b * 100;
    }
}

class BrokenCalculator extends Calculator
{
    use someMath;

    function add($a, $b)
    {
        return 9;
    }
}

$cal = new BrokenCalculator();
echo $cal->add(4, 6); // echoes 9
echo $cal->multiply(2, 2); // echoes 4
echo $cal->subtract(5, 3); // echoes 2

You can do a lot more cool things with traits, but there is no use on duplicating what is already well documented. You can see more use cases here: PHP Manual: Traits

[ design_patterns  php  programming  traits  ]
Mutexes in C++ design_patterns programming
Passing by reference to a thread in C++ design_patterns programming
Futures, async, packaged_tasks and promises in C++ design_patterns programming
C++ Header files  design_patterns programming
Models in Beego design_patterns programming