¿Qué son los traits en PHP?

Descubre qué son los traits de PHP y cómo puedes emplearlos para reutilizar código

Image for post
Image for post
class A {  use Something;}

Una breve introducción

Image for post
Image for post

¿Cómo funcionan los traits en PHP?

<?phptrait Timestampable {  protected $createdAt;  public function getCreatedAt() {    return $this->createdAt;  }  public function setCreatedAt(\DateTimeInterface $createdAt) {    $this->createdAt = $createdAt;    return $this;  }}
class A {  use Timestampable;}class B {  use Timestampable;}

Características de los traits

trait T {    public $prop = null;    public function __construct($prop) {
echo "Constructor called\n";
$this->prop = $prop;
}
public function __destruct() {
echo "Destructor called\n";
}
}
class A {
use T;
}
$a = new A("Hello World\n"); // Constructor calledecho $a->prop; // Hello World// Destructor called
trait Foo {    public function sayHello() {
echo 'Hi'. $this->getName();
}
abstract public function getName();}

class Bar {
private $name;
use Foo;
public function getName() {
return $this->name;
}
public function setName($name) {
$this->name = $name;
}
}
trait Foo {
public static function doFoo() {
echo 'do foo';
}
}

class Bar {
use Foo;
}

Bar::doFoo(); // do foo
trait Foo {
public function doFoo() {
echo 'do foo';
}
}
trait Bar {
public function doBar() {
echo 'do bar';
}
}
class Zeta {
use Foo, Bar;
}
$zeta = new Zeta();$zeta->doFoo();$zeta->doBar();
trait Foo {
public function doFoo() {
echo 'foo';
}
}

trait Bar {
public function doBar() {
echo 'bar';
}
}

trait Zeta {
use Foo, Bar;
}

class A {
use Zeta;
}

$o = new A();
$o->doFoo();
$o->doBar();

Precedencia en los traits

class Foo {
public function doFoo() {
echo 'do foo';
}
}

trait Bar {
public function doFoo() {
echo 'do bar';
}
}

class Zeta extends Foo {
use Bar;
}

$o = new Zeta();
$o->doFoo(); // 'do bar'
class Foo {
public function doFoo() {
echo 'do foo';
}
}

trait Bar {
public function doFoo() {
echo 'do bar';
}
}

class Zeta extends Foo {
use Bar;
public function doFoo() {
echo 'do foo again';
}
}

$o = new Zeta();
$o->doFoo(); // 'do foo again'
trait Foo {
public function doFoo() {
echo 'do foo';
}
}
trait AnotherFoo {
public function doFoo() {
echo 'do another foo';
}
}
class Zeta { use Foo, AnotherFoo { Foo::doFoo insteadof AnotherFoo; }}$zeta = new Zeta();$zeta->doFoo(); // do foo

Conclusiones

¿Quieres recibir más artículos como este?

Entre paseo y paseo con Simba desarrollo en Symfony y React

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store