Computer >> Máy Tính >  >> Lập trình >> PHP

Đặc điểm PHP

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