[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
class Messenger
{
}
class Hello
{
public function hello()
{
echo "Hello","\n"
}
}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.
class Messenger extends Hello
{
}
$o = new Messenger;
$o->hello();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
Was this helpful?