Traits trong OOP PHP
Như bạn đã biết, trong PHP không thể kế thừa từ nhiều lớp cùng một lúc, chỉ từ một lớp. Trước đây chúng ta đã học qua giải pháp cho vấn đề này: thay vì kế thừa, hãy sử dụng các đối tượng của lớp này bên trong các lớp khác.
Trong PHP còn có một cách khác. Nó nằm trong việc sử dụng traits. Một trait đại diện cho một tập hợp các thuộc tính và phương thức có thể được đưa vào một lớp khác. Khi đó, các thuộc tính và phương thức của trait sẽ được lớp coi như của chính nó.
Cú pháp của trait giống như của lớp,
ngoại trừ việc tên trait cần
được khai báo bằng từ khóa
trait.
Không thể tạo một thể hiện của trait - traits
chỉ dành để kết nối với các lớp
khác. Việc kết nối tự nó được thực hiện
bằng lệnh use, sau đó
là tên của trait được kết nối, cách nhau bằng dấu cách.
Lệnh này được viết ở đầu lớp.
Hãy xem ứng dụng của traits trong một ví dụ
thực tế. Giả sử chúng ta có trait
Helper này, chứa các thuộc tính private
name và age, cũng như các getter của chúng:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
Giả sử chúng ta cũng có lớp User này,
trong constructor của nó, các thuộc tính
name và age được thiết lập:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Bây giờ hãy thêm các getter cho các thuộc tính
của lớp User của chúng ta. Chỉ là chúng ta sẽ không
viết chúng trong chính lớp đó, mà chỉ cần kết nối
trait Helper, trong đó các phương thức này
đã được triển khai:
<?php
class User
{
use Helper; // kết nối trait
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Sau khi kết nối trait, trong lớp của chúng ta sẽ xuất hiện các phương thức và thuộc tính của trait đó. Và chúng ta sẽ truy cập chúng như thể chúng là các phương thức và thuộc tính của chính lớp:
<?php
$user = new User('john', 30);
echo $user->getName(); // sẽ in ra 'john'
echo $user->getAge(); // sẽ in ra 30
?>
Triển khai lớp City với các thuộc tính
name, age, population
và các getter cho chúng. Hãy để lớp của chúng ta
sử dụng trait Helper đã tạo
để rút ngắn mã của nó.