Traits trong lập trình hướng đối tượng OOP

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();

Bài viết nên đọc

Trên đây là những kiến thức từ kinh nghiệm bản thân mình nên các bạn có thể tham khảo. Nếu các bạn có góp ý cho mình thì hãy gửi vào đây, mình sẵn sàng nhận ý kiến đóng góp từ các bạn.

Ngoc Phuong

Ngoc Phuong - 82 bài viết - Đánh giá:

Có 2 cách học hiệu quả nhất, 1 là nói cho người khác biết thứ bạn mới học được, 2 là nói cho người khác biết thứ bạn sắp quên. Tôi mới học được rất nhiều thứ. Tôi cũng sắp quên rất nhiều thứ.

Để lại bình luận

Địa chỉ email của bạn sẽ không được công khai