0

php Traits là gì?

PhpTrait là gì? :man_running:

  • Một Trait đơn giản là một nhóm các phương thức bạn muốn thêm vào một class khác. Một Trait, giống như abstract class, không thể khởi tạo.

Ví dụ

trait Sharable {
 
  public function share($item)
  {
    return 'share this item';
  }
 
}

  • Bạn có thể thêm Traint giống như sau:
class Post {
 
  use Sharable;
 
}
 
class Comment {
 
  use Sharable;
 
}

Giờ, nếu chúng ta tạo một object mới thì cả hai class đều có phương thức share(). 👌

$post = new Post;
echo $post->share(''); // 'share this item' 
 
$comment = new Comment;
echo $comment->share(''); // 'share this item'

Trait hoạt động như thế nào? :man_walking:

  • Trait hoạt động giống như cách hoạt động của "copy và paste". Nghĩa là thay vì việc phải copy đoạn code đó vào từng class bạn để sử dụng, khi bạn sử dụng trait, nó sẽ tương tự như việc bạn copy toàn bộ code của traint đó vào nơi mà bạn định nghĩa class đó.
  • Chú ý rằng khi sử dụng traint, bạn có thể overwrite lại phương thức của một trait.

Traits khác gì Abstract classes? 👷

  • Trait khác với một Abstract class, ở chỗ nó không thể kế thừa.
  • Tưởng tượng rằng Post và Comment sẽ phải kế thừa từ AbstractSocial class. Như vậy chúng ta sẽ có cây kế thừa như sau:
class AbstractValidate extends AbstractCache {}
class AbstractSocial extends AbstractValidate {}
class Post extends AbstractSocial {}

Nhìn sơ đồ kế thừa, ta thấy chúng có nhiều lớp, từ Post đến AbstractCache, nó đã trải qua mấy đời rồi. Và sự tình đơn giản là like và share nó không biết đã biến tướng như nào rồi. giả sử phương thức like để public, nhưng lại gọi đến một thuộc tính private, và thuộc tính private đó không được kế thừa. Thôi xong, phương thức đó đã chính thức trở thành vô nghĩa. 😛

Trait khác gì với Interfaces? :man_construction_worker:

Trait nhìn có vẻ tốt hơn Interface. Cả Trait và Interface đều rất đơn giản để sử dụng mà không quan tâm nhiều đến những cài đặt bên trong class. Tuy nhiên, điều khác biệt ở đây là Interface cung cấp rằng Interface có khả năng thực hiện , còn Trait cung cấp khả năng thực hiện.

Nói như vậy hơi mông lung, hiểu nôm na là giả sử bạn cần một chức năng nào đó, và bạn gửi đến interface một yêu cầu với các tham số tương ứng. Còn với trait, khi bạn sử dụng trait, thì tự bản thân bạn đã có thể thực hiện chức năng đó.

Ví dụ

For example:

// Interface
interface Sociable {
 
  public function like();
  public function share();
 
}
 
// Trait
trait Sharable {
 
  public function share($item)
  {
    // share this item
  } 
 
}
 
// Class
class Post implements Sociable {
 
  use Sharable;
 
  public function like()
  {
    //
  }
 
}

Trong ví dụ này , thì Sociable interface cung cấp Post có khả năng thực hiện like và share Còn khi sử dụng Trait, share() và like() là những phương thức được cài đặt trong class Post. The Sharable Trait implements the share() method and the like() method is implemented in the Post class.

Điểm mạnh của trait? ☺️

  • Tránh code bị lặp lại nhiều lần.
  • Ngăn trặn phải sự kế thừa phức tạp.
  • Cung cấp một cách đơn giản để tái sử dụng code, tăng hiệu xuất chương trình.

Điểm yếu của Trait? 😅 😅 😅

  • Trait cung cấp cho 1 class quá nhiều khả năng. Nhiều cái còn chẳng dùng dến, nhưng nó đã được định nghĩa trong trait, nên khi dùng trait trong class, nó sẽ được coi như nó đã được cài đặt trong class. Ví dụ giả sử chúng ta có class tên là Mèo, và chúng ta sử dụng trait di chuyển trong class Mèo, và chúng ta cung cấp cho một con mèo có khả năng bay, khả năng bơi, đào đất. Nghe có vẻ có gì đó sai sai.. 🤦♂
  • Một điểm yếu khác nữa khi sử dụng trait, là người code không thực sự hiểu rõ mọi chi tiết về trait, hoặc chỉ sử dụng 1 phần nhỏ code của trait, nhưng phải chứa toàn bộ code của trait trong một class. Nó dư thừa nhiều. However with that being said, there are possible drawbacks when using Traits too.

Khi nào NÊN sử dụng Trait :upside_down: :upside_down: :upside_down:

  • Khi trait thực hiện chức năng một cách chính xác và nhỏ gọn.
  • Khi trait đơn giản và chắc chắn là bạn hiểu hoàn toàn rõ nó như bạn hiểu tình yêu của mình :face_with_monocle:
  • Khi trait được sử dụng ở nhiều hơn một class, hoặc chức năng quá phức tạp để cài đặt.
  • Khi bạn lười, và không có thời gian để làm những việc mà bạn nên làm.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí