Giới thiệu
PHP không hỗ trợ đa kế thừa. Hạn chế này được khắc phục ở một mức độ nào đó nhờ tính năng của đặc điểm . Nó là một cơ chế tái sử dụng mã. Định nghĩa tính trạng tương tự như lớp. Tuy nhiên, nó không thể được khởi tạo trực tiếp. Thay vào đó, chức năng của một đặc điểm được cung cấp cho một lớp bằng cách sử dụng từ khóa. Do đó, một lớp có thể tận dụng các phương thức được xác định trong một đặc điểm hoặc thậm chí có thể ghi đè chúng. Điều này bổ sung cho bất kỳ lớp cha nào khác mà nó có thể đang kế thừa.
Một đặc điểm cũng tương tự như giao diện. Sự khác biệt là giao diện không cung cấp định nghĩa của phương thức bên trong nó, mà phải được thực hiện bằng cách triển khai lớp. Tuy nhiên, phương thức đặc điểm cung cấp định nghĩa, có thể có hoặc không được ghi đè bởi lớp sử dụng đặc điểm.
Cú pháp
<?php trait testtrait{ public function test1(){ //body of method } } //using trait class testclass{ use testtrait //rest of members in class } ?>
Ví dụ
Trong đoạn mã sau, một đặc điểm có hai phương thức được sử dụng trong một lớp ghi đè một trong các phương thức
Ví dụ
<?php //definition of trait trait testtrait{ public function test1(){ echo "test1 method in trait\n"; } public function test2(){ echo "test2 method in trait\n"; } } //using trait class testclass{ use testtrait; public function test1(){ echo "test1 method overridden\n"; } } $obj=new testclass(); $obj->test1(); $obj->test2(); ?>
Đầu ra
Kết quả như bên dưới -
test1 method overridden test2 method in trait
Đặc điểm ở lớp con
Đây là ưu điểm chính của đặc điểm. Một lớp có cha cũng có thể sử dụng một đặc điểm và có thể chọn ghi đè phương thức của nó. Do đó đạt được hiệu quả đa kế thừa. Ví dụ về tính năng này được đưa ra bên dưới -
Ví dụ
<?php //definition of trait trait testtrait{ public function test1(){ echo "test1 method in trait\n"; } } //parent class class parentclass{ public function test2(){ echo "test2 method in parent\n"; } } //using trait and parent class class childclass extends parentclass{ use testtrait; public function test1(){ echo "parent method overridden\n"; } public function test2(){ echo "trait method overridden\n"; } } $obj=new childclass(); $obj->test1(); $obj->test2(); ?>
Đầu ra
Đoạn mã trên tạo ra kết quả sau -
parent method overridden trait method overridden
Đặc điểm với giao diện
Có thể có một lớp triển khai giao diện, mở rộng lớp cha khác và sử dụng đặc điểm cùng một lúc
Ví dụ
<?php //definition of trait trait mytrait{ public function test1(){ echo "test1 method in trait1\n"; } } class myclass{ public function test2(){ echo "test2 method in parent class\n"; } } interface myinterface{ public function test3(); } //using trait and parent class class testclass extends myclass implements myinterface{ use mytrait; public function test3(){ echo "implementation of test3 method\n"; } } $obj=new testclass(); $obj->test1(); $obj->test2(); $obj->test3(); ?>
Đầu ra
Điều này sẽ tạo ra kết quả sau -
test1 method in trait1 test2 method in parent class implementation of test3 method
giải quyết xung đột
Nếu một lớp sử dụng hai đặc điểm với một phương thức chung, thì xung đột của chúng sẽ được giải quyết bằng toán tử giải quyết phạm vi và thay vì từ khóa
Ví dụ
<?php trait trait1{ public function test1(){ echo "test1 method in trait1\n"; } public function test2(){ echo "test2 method in trait1\n"; } } trait trait2{ public function test1(){ echo "test1 method in trait2\n"; } public function test2(){ echo "test2 method in trait2\n"; } } //using trait and parent class class testclass { use trait1, trait2{ trait1::test1 insteadof trait2; trait2::test2 insteadof trait1; } } $obj=new testclass(); $obj->test1(); $obj->test2(); ?>
Đầu ra
Tập lệnh trên tạo ra kết quả sau
test1 method in trait1 test2 method in trait2