hugopereira84
4/28/2015 - 10:19 PM

Using PHP traits (original post: https://www.harrytorry.co.uk/php/using-php-traits/)

Using PHP traits (original post: https://www.harrytorry.co.uk/php/using-php-traits/)

To use Traits, you need to be using PHP >=5.4.

More info.: http://stackoverflow.com/questions/9205083/php-traits-vs-interfaces

This is an example of how a trait works, taken straight from the docs;

<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>
This will output `Hello World!`. Nice and simple, no jargon.


Trait Properties
It’s no more difficult that the example above, it really is simple stuff.

trait PropertiesTrait {
    public $x = 1;
}

class PropertiesExample {
    use PropertiesTrait;
}

$example = new PropertiesExample;
$example->x;
 

Avoiding naming conflicts
You can rename functions to avoid conflicting names like so. If you try to overload variable names, you will get a fatal error.

trait A {
    function addOne($v) {
        return $v+1;
    }
}

class MyClass {
    use A {
        addOne as pleaseAddOne;
    }

    function calc($v) {
        $v++;
        return $this->pleaseAddOne($v);
    }
}
Traits made from multiple traits

Sometimes, your app is going to become a large chunk of code with foos and bars everywhere, so you’re going to want to group multiple traits together to help break your application up.

trait add {
    public function add($a, $b) {
        return $a + $b;
    }
}

trait subtract {
    public function subtract($a, $b) {
        return $a - $b;
    }
}

trait basicMath{
    use add, subtract;
}

class app {
    use basicMath;
}

$myObject = new app();
echo $myObject->add(2, 3) . " and " . $myObject->subtract(20, 13); // 5 and 7
Now you have lots of small pieces of logic that can be used anywhere, whilst still being completely manageable.

Order of precedence

<?php
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}

class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo 'Hello Universe!';
    }
}

$o = new TheWorldIsNotEnough();
$o->sayHello(); //Hello Universe!
 

So all I’m trying to say, this sort of stuff is really simple and good to use. Don’t be afraid of using it.