PHP, Web development

Trait – Mixin in PHP?

Hi guys 🙂

Như các bạn có lẽ đã biết, PHP là 1 ngôn ngữ single inheritance, tức là nó sẽ có 1 số nhược điểm như:

  • Mất thời gian & công sức khi tìm hiểu/chạy hệ thống. Ví dụ: 1 class có 10 levels các class cha, thì về cơ bản nó sẽ phải chạy qua cả 10 levels đó để chạy 1 function mà nó thừa kế
  • Class cha và class con bị ràng buộc với nhau. Tức là ta không thể tách riêng biệt 1 class nào để sử dụng được.
  • Theo thời gian, thêm, sửa, xóa các chức năng cần phải rất cẩn thận, nhiều trường hợp là gần như không thể do độ phức tạp của cây thừa kế các class đó.
  • Cực kì không linh hoạt trong nhiều trường hợp. Ví dụ bạn chỉ cần 1 class đơn giản, chứa vài cái functions bạn hay sử dụng trong hệ thống, class này có thể dính dáng đến nhiều phần khác nhau trong hệ thống, nên việc thừa kế nó có vẻ sẽ tạo nên 1 nút xoắn cực khó gỡ trong cây thừa kế các class.

May mắn thay, từ PHP5.4, chúng ta đã có Trait để giải quyết các vấn đề nói trên. Nhưng liệu Trait có phải là Holy Grail cho PHP? Liệu khi nào nên dùng Trait? Khi nào thì phải tránh? Mời các bạn kéo xuống dưới để tìm hiểu cùng mình nhé 😉

  1. Trait là gì?

Traits is a mechanism for code reuse in single inheritance languages such as PHP. A Trait is intended to reduce some limitations of single inheritance by enabling a developer to reuse sets of methods freely in several independent classes living in different class hierarchies.

Source

… okay… hơi lằng nhằng phải không?

Ngắn gọn thì Trait cũng giống như 1 abstract class vậy. Bạn chứa các methods, properties trong đó, nhưng bạn không thể instantiate (tạo object) nó được.

Nói dễ hiểu, Trait là 1 mớ code bạn có thể dùng bất cứ chỗ nào bạn muốn. Simple as that 🙂
Nghe thì đơn giản thôi nhưng mà hơi bị hay đấy. Next, làm nào để dùng Trait? Phải cho ví dụ cụ thể người ta mới hiểu được chứ, đúng không!?

  1. Sử dụng Trait thế nào?

Ở đây mình sẽ trình bày cho các bạn cách sử dụng Trait trong rất nhiều trường hợp, có thể sẽ hơi dài, chịu khó đọc nhé 😉

  • Ví dụ đơn giản:
<?php

/** Định nghĩa 1 Trait **/
trait ToolBox {
    function hammer() {}
    function dumpdie() {}
} 

/** Sử dụng Trait **/
class HotBabe {
    use ToolBox; //"import" trait
    function doIt() {
         hammer(); //Use Trait's function
    }
}
?>
  • Về quyền ưu tiên, nếu trùng tên function của Trait với function của Base class, thì chuyện gì sẽ xảy ra?

To be continue…

Reply