Traits em OOP em PHP
Como você já sabe, em PHP não é possível herdar de várias classes ao mesmo tempo, apenas de uma. Anteriormente, já passamos pela solução para esse problema: em vez de herança, usar objetos de algumas classes dentro de outras.
No PHP, existe outra maneira. Ela consiste no uso de traits. Um trait representa um conjunto de propriedades e métodos que podem ser incluídos em outra classe. Nesse caso, as propriedades e métodos do trait serão percebidos pela classe como se fossem seus.
A sintaxe de um trait é a mesma de uma classe,
exceto que o nome do trait precisa ser
declarado usando a palavra-chave
trait
.
Não é possível criar uma instância de um trait - os traits
são destinados apenas para conexão a outras
classes. A própria conexão é realizada
com o comando use
, após o qual
é indicado, separado por um espaço, o nome do trait
a ser conectado. Este comando é escrito no início da classe.
Vamos ver a aplicação de traits em um exemplo
prático. Suponha que tenhamos o seguinte trait
Helper
, contendo as propriedades privadas
name
e age
, bem como seus getters:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Suponha que também tenhamos a seguinte classe User
,
em cujo construtor são definidas as propriedades
name
e age
:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Agora, vamos adicionar os getters para as propriedades
de nossa classe User
. Só que não vamos
escrevê-los na própria classe, mas simplesmente conectar
o trait Helper
, no qual esses métodos
já estão implementados:
<?php
class User
{
use Helper; // conectamos o trait
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Após a conexão do trait, em nossa classe aparecerão os métodos e propriedades desse trait. Nesse caso, vamos nos referir a eles como se fossem métodos e propriedades da própria classe:
<?php
$user = new User('john', 30);
echo $user->getName(); // exibirá 'john'
echo $user->getAge(); // exibirá 30
?>
Implemente a classe City
com as propriedades
name
, age
, population
e os getters para elas. Suponha que nossa classe
para encurtar seu código use o trait Helper
já criado por nós.