[TRAIT] Trait trong PHP "Đặt vấn đề" (ok)
https://viblo.asia/p/trait-trong-php-3Q75wa1QZWb
Trait trong PHP
Đặt vấn đề
ta có ví dụ sau: ta có hai class Messenger
và Hello
giả sử, bạn muốn class Messenger
có thể sử dụng hàm hello()
của class Hello
. Vì class Messenger
chưa extends
bất kì một class nào nên ta chỉ cần extends
class Hello
là xong.
bây giờ ta có thêm 1 class nữa:
giả sử, bạn cũng muốn class Messenger
cũng có thể sử dụng hàm goodbye()
của class Goodbye
. Vì class Messenger
đã extends class Hello
rồi nên ta không thể extends
thêm class Goodbye
nữa. Đó là bởi vì trong PHP, một class chỉ có thể có một class cha. Một số ngôn ngữ khác cho phép một class có thể có nhiều class cha(đa kế thừa). Tuy nhiên, đa kế thừa sẽ kéo theo một loạt vấn đề nhập nhằng và nó có tiếng xấu là làm phức tạp trong việc kế thừa các lớp đơn giản hơn. Traits được sinh ra để giải quyết vấn đề này.
Tạo Traits
cú pháp của Trait cũng gần giống như 1 class bình thường.
bây giờ trong class Messenger
ta dùng từ khóa use
để sử dụng trait
rất đơn giản phải không nào.
Để giải quyết bài toán trong ví dụ mình đã nêu ở đầu, ta chỉ cần tạo 2 trait Hello
và Goodbye
và use nó trong class Message
là xong.
ta sẽ có được output như sau:
You say goodbye Goodbye and I say hello Hello World
Những lưu ý khi sử dụng Trait
Trait được ưu tiên hơn extends.
ta có 1 class Base
và 1 trait SayWorld
đều có phương thức sayHello()
. Class MyHelloWorld
vừa extends class Base
vừa use trait SayWorld
.
kết quả
World!
Sử lí conflict khi sử dụng nhiều trait có hàm có tên giống nhau
trong ví dụ này, ta có 3 trait A, B, C đều có chung 2 phương thức smallTalk()
và bigTalk()
. Nếu class Talker
muốn sử dụng cả 3 trait này thì phải chỉ định phải dùng hàm nào của trait nào bằng từ khóa insteadof
. Nếu ta muốn sử dụng hàm của C nữa, ta phải sử dụng 1 cái tên khác cho hàm đó.
Thay đổi phạm vi cho phép sử dụng phương thức
trong trait cũng có thể có cácabstract method
.
abstract method
.kết quả ta thu được:
I am going to say hello Hello World
biến và hàm static
trong trait cũng có thể định nghĩa biến và hàm static
Định nghĩa thuộc tính trong trait
một class không thể có một thuộc tính trùng với tên thuộc tính của trait trừ khi nó tương thích (cùng phạm vi và cùng giá trị).
Last updated