Ngôn ngữ PHP chỉ hỗ trợ đơn thừa kế: một lớp con chỉ có thể kế thừa từ một lớp cha duy nhất. Để khắc phục những giới hạn của đơn kế thừa trong việc sử dụng lại mã nguồn, từ PHP 5.4 trở đi PHP hỗ trợ Traits giúp cho lập trình viên có thể sử dụng lại các phương thức từ các class khác nhau một cách dễ dàng hơn.

I. Tìm hiểu về Traits trong PHP

1. Traits là gì?

Traits được sử dụng để khai báo các phương thức có thể được sử dụng trong nhiều class.

Traits có thể được hiểu như là một class, giúp tập hợp một nhóm phương thức mà chúng ta muốn sử dụng trong một class khác., nó không thể được khởi tạo, thay vào đó chúng ta sử dụng từ khóa use

Để khai báo Traits ta sử dụng từ khoá trait

<?php
trait TraitName {
  // some code...
}
?>

Để sử dụng Traits trong class, ra sử dụng từ khóa use

<?php
class MyClass {
  use TraitName;
}
?>

2. Các đặc điểm của Traits

  • Traits có chức năng gom những đoạn code trùng lặp ra một nơi sử dụng ở nhiều nơi và nếu cần thay đổi bạn chỉ cần sửa đổi ở một file duy nhất.
  • Traits như một abstract class(đều không thể khởi tạo được) nhưng không hoàn toàn giống nhau.
  • Các phương thức trong Traits có thể bị override lại trong class sử dụng nó.

3. Ưu nhược điểm của Traits

Ưu điểm

  • Giảm việc lặp code đáp ứng được nguyên tắc(DRY - Don't Repeat Yoursefl).
  • Khắc phục được điểm yếu đơn kế thừa của PHP.

Nhược điểm

  • Sử dụng Traits gây ra khó khăn trong việc đọc các phương thức từ một class có sử dụng Traits.

II. Những lưu ý khi sử dụng Traits

1. Trait Được Ưu Tiên Hơn Extends

Ví dụ ta có Trait RollUp và Class Person đều có phương thức sayHello(), class Student vừa Extends class Person vừa use Trait thì chương trình sẽ ưu tiên phương thức sayHello() ở Trait

class Person {
    public function sayHello() {
        echo 'Hello!';
    }
}

trait RollUp {
    public function sayHello() {
        echo 'Hi!';
    }
}

class Student extends Person {
    use RollUp;
}

$student = new Student();
$student->sayHello();

2. Cách xử lý xung đột khi sử dụng nhiều Trait có tên phương thức giống nhau

Ví dụ ta có 2 Trait lần lượt là Admin, Member đều có phương thức login(), để class Client sử dụng phương thức login() của Trait Member thì ta sử dụng từ khoá insteadof để xét độ ưu tiên cho phương thức bạn muốn sử dụng.

trait Admin {
    public function login() {
        echo 'Login for Admin';
    }
}

trait Member {
    public function login() {
        echo 'Login for Member';
    }
}

class Client{
    use Admin, Member{
    Member::login insteadof Admin; // Sử dụng phương thức login ở trait Member thay cho Admin
    } 
}

$client = new Client();
$client->login();

3. Thay đổi phạm vi truy cập của phương thức trong Trait

Ví dụ ta có Trait User có phương thức login() là public, ta muốn đổi phạm vi phương thức login() là protected thì trong class Client use Trait ta có thể làm như sau

trait User {
    public function login() {
        echo 'Login Success!';
    }
}

// Thay đổi phạm vi sử dụng của phương thức login
class Client {
    use User { login as protected; }
}

4. Trong Trait cũng có thể có các phương thức abstract

Ta có thể định nghĩa phương thức abstract trong Trait

trait Hello
{
    abstract public function sendMessage();

    public function hello()
    {
        echo "Hello World";
    }

} 

class Messenger
{
    use Hello;
    public function sendMessage()
    {
        echo 'I am going to say hello';
        echo $this->hello();
    }
}

$sms = new Messenger;
$sms->sendMessage();

5. Trait có thể lồng nhau

Trait lồng nhau có nghĩa là khi Trait A có phương thức a(), Trait B được use Trait A thì Trait B cũng sẽ sử dụng được phương thức a().

trait A
{
   public function a(){
     echo "Hihi";
   }
}
trait B
{
    use A;
}

class C {
  use B;
}

$c = new C();
$c->a();
Ngọc Phương

Web Developer

Cảm ơn các bạn đã ghé thăm blog của tôi. Tôi tên là Phương và tôi đã có hơn 10 năm kinh nghiệm trong lĩnh vực phát triển website. Tôi tự tin khẳng định mình là chuyên gia trong việc tạo ra những trang web ấn tượng và hiệu quả. Bạn nào có nhu cầu thiết kế website có thể liên hệ cho tôi qua zalo 0935040740.

2 nhận xét

  • Anh Long

    Feb 17, 2019 . 300k views . Reply

    Cảm ơn tác giả đã chia sẻ bài viết rất thú vị

Bài viết liên quan