Thuộc tính trừu tượng đặc điểm PHP

Các lớp và phương thức trừu tượng là khi lớp cha có một phương thức được đặt tên, nhưng cần [các] lớp con của nó để thực hiện các tác vụ

Lớp trừu tượng là lớp chứa ít nhất một phương thức trừu tượng. Một phương thức trừu tượng là một phương thức được khai báo, nhưng không được triển khai trong mã

Một lớp hoặc phương thức trừu tượng được định nghĩa bằng từ khóa

class MyClass {
   use SayGreeting;
}
4

cú pháp

lớp trừu tượng ParentClass {
  hàm công khai trừu tượng someMethod1[];
  hàm công khai trừu tượng someMethod2[$name, $color];
  abstract public function someMethod3[] : string;
}
?>

Khi kế thừa từ một lớp trừu tượng, phương thức của lớp con phải được định nghĩa có cùng tên và cùng hoặc một công cụ sửa đổi truy cập ít bị hạn chế hơn. Vì vậy, nếu phương thức trừu tượng được định nghĩa là được bảo vệ, thì phương thức của lớp con phải được định nghĩa là được bảo vệ hoặc công khai, nhưng không phải là riêng tư. Ngoài ra, loại và số lượng đối số bắt buộc phải giống nhau. Tuy nhiên, các lớp con có thể có thêm các đối số tùy chọn

Vì vậy, khi một lớp con được kế thừa từ một lớp trừu tượng, chúng ta có các quy tắc sau

  • Phương thức của lớp con phải được định nghĩa cùng tên và nó khai báo lại phương thức trừu tượng của lớp cha
  • Phương thức của lớp con phải được định nghĩa với cùng một công cụ sửa đổi truy cập ít bị hạn chế hơn
  • Số lượng đối số bắt buộc phải giống nhau. Tuy nhiên, lớp con có thể có thêm các đối số tùy chọn

Hãy xem một ví dụ

Ví dụ

// Lớp cha
lớp trừu tượng Xe {
  public $name;
  public function __construct[$name . chuỗi;
    $this->name = $name;
  }
  abstract public function intro[] : string;
}

// Các lớp con
class Audi extends Car {
  public function intro[]. chuỗi {
    return "Chọn chất lượng của Đức. Tôi là $this->name. ";
  }
}

class Volvo mở rộng Car {
  public function intro[]. string {
    return "Tự hào là người Thụy Điển. Tôi là $this->name. ";
  }
}

class Citroen extends Car {
  public function intro[]. chuỗi {
    return "Sự xa hoa kiểu Pháp. Tôi là $this->name. ";
  }
}

// Tạo đối tượng từ các lớp con
$audi = new audi["Audi"];
echo $audi->intro[]
echo "
";

$volvo = new volvo["Volvo"];
echo $volvo->intro[];
echo "
";

$citroen = new citroen["Citroen"];
echo $citroen->intro[];
?>

Tự mình thử »

Ví dụ giải thích

Các lớp Audi, Volvo và Citroen được kế thừa từ lớp Car. Điều này có nghĩa là các lớp Audi, Volvo và Citroen có thể sử dụng thuộc tính $name công khai cũng như phương thức __construct[] công khai từ lớp Car do tính kế thừa

Tuy nhiên, intro[] là một phương thức trừu tượng nên được định nghĩa trong tất cả các lớp con và chúng sẽ trả về một chuỗi

PHP - Các ví dụ về lớp trừu tượng khác

Hãy xem một ví dụ khác trong đó phương thức trừu tượng có một đối số và lớp con có hai đối số tùy chọn không được định nghĩa trong phương thức trừu tượng của cha mẹ

Chúng là gì, cách sử dụng chúng và chúng khác với các giao diện, lớp trừu tượng và hàm toàn cục như thế nào. Tất cả với rất nhiều ví dụ

Bắt đầu nào

nội dung

  • Đặc điểm trong PHP là gì?
  • Cách sử dụng Đặc điểm
  • Đặc điểm có thể chứa gì?
  • phương pháp ưu tiên
  • Phương pháp răng cưa và xung đột
  • Đặc điểm thực hành tốt

Đặc điểm trong PHP là gì?

Một đặc điểm là một cấu trúc PHP cho phép bạn sử dụng lại cùng một mã trong các lớp khác nhau

Bạn có thể xác định một đặc điểm bằng cú pháp sau

trait SayGreeting {
   private $name = 'Alex';
   
   public function sayHello[] {
      echo 'Hello, I\'m ' . $this->name;
   }
}

Các đặc điểm có thể chứa các phương thức [như sayHello[]] và các thuộc tính [như $name]

Các đặc điểm cũng hỗ trợ các toán tử hiển thị [công khai, được bảo vệ và riêng tư], các phương thức và thuộc tính tĩnh cũng như các toán tử lớp như cha mẹ. , bản thân. và $này

Các lớp PHP có thể sử dụng các đặc điểm và bao gồm mã của các đặc điểm

Để làm cho một lớp sử dụng một đặc điểm, bạn cần sử dụng từ khóa

Ví dụ

class MyClass {
   use SayGreeting;
}

Trong ví dụ trên, lớp MyClass sử dụng đặc điểm SayGreeting. Bằng cách đó, nó giống như tất cả mã bên trong đặc điểm được sao chép vào lớp

Lớp bây giờ có phương thức sayHello[] cũng như thuộc tính $name

$myClass = new MyClass[];
$myClass->sayHello[];
/* Output:
 * Hello, I'm Alex
*/

Cách sử dụng Đặc điểm

Tóm lại, một đặc điểm là một cấu trúc ngăn chặn sự trùng lặp mã trong các lớp

Các lớp khác nhau có thể sử dụng cùng một đặc điểm và bao gồm các phương thức và thuộc tính của đặc điểm đó

Đặc điểm có một số điểm tương đồng với giao diện và với các lớp trừu tượng

Chúng cũng tương tự như các tập lệnh “bao gồm” có chứa các hàm toàn cục

Nhưng các đặc điểm cũng có những điểm khác biệt quan trọng khiến chúng trở nên độc nhất

Hãy xem cái nào chi tiết

Đặc điểm vs Giao diện

Giao diện là một cấu trúc OOP cho phép bạn chia sẻ cùng một bộ chức năng giữa các lớp khác nhau

Bạn có thể tìm thấy lời giải thích chuyên sâu về các giao diện PHP trong hướng dẫn này

Các giao diện cụ thể hơn các đặc điểm, bởi vì chúng chỉ có thể chứa các phương thức trừu tượng

Tùy thuộc vào lớp triển khai giao diện để thực sự triển khai các phương thức

Với các giao diện, hoàn toàn không có việc sử dụng lại mã vì mọi lớp phải thực hiện các phương thức

Mặt khác, các đặc điểm có thể cung cấp các phương thức được triển khai đầy đủ, trên các thuộc tính và toán tử lớp

Các lớp sử dụng đặc điểm có thể sử dụng lại tất cả mã riêng của đặc điểm mà không có sự trùng lặp mã nào

Đặc điểm vs Lớp trừu tượng

Cả hai đặc điểm và các lớp trừu tượng có thể bao gồm các phương thức, trừu tượng hoặc được triển khai đầy đủ

Tuy nhiên, nếu bạn muốn sử dụng các phương thức từ một lớp trừu tượng sang một lớp khác, bạn phải mở rộng lớp trừu tượng

Bạn có thể tìm thấy lời giải thích chuyên sâu về các lớp trừu tượng PHP trong hướng dẫn này

Nếu bạn muốn sử dụng các phương thức từ một lớp trừu tượng, bạn phải thiết lập quan hệ thừa kế với lớp của mình. Đây không phải lúc nào cũng là điều bạn muốn

Hơn nữa, PHP không hỗ trợ đa kế thừa nên bạn không thể mở rộng từ nhiều hơn một lớp

Điều này làm cho không thể định nghĩa các tập hàm khác nhau trong các lớp trừu tượng khác nhau và sau đó mở rộng từ chúng để tạo các kết hợp khác nhau

Đặc điểm giải quyết cả hai vấn đề

  1. Bạn có thể sử dụng cùng một đặc điểm trong các lớp hoàn toàn không liên quan mà không cần thiết lập quan hệ thừa kế giữa chúng
  2. Bạn có thể sử dụng nhiều đặc điểm hơn trong cùng một lớp

Đặc điểm so với Tập lệnh bao gồm với Chức năng toàn cầu

Tập lệnh “Bao gồm” chứa các hàm PHP. Nếu bạn cần các hàm đó trong tập lệnh PHP khác, bạn chỉ cần đưa tập lệnh đó vào

Đặc điểm cung cấp một giải pháp tương tự. Trên thực tế, mục đích chính của các đặc điểm là xác định một số mã một lần và sau đó sử dụng nó trong các lớp khác nhau

Tuy nhiên, có ba điểm khác biệt chính giữa các đặc điểm và chức năng toàn cục.

  1. Các chức năng toàn cầu có thể được sử dụng ở bất cứ đâu, trong khi các đặc điểm chỉ có thể được sử dụng bên trong các lớp
  2. Các đặc điểm có thể chứa các thành phần và toán tử lớp như phương thức, thuộc tính, công cụ sửa đổi khả năng hiển thị [công khai, được bảo vệ, riêng tư] và toán tử lớp [tự. , cha mẹ. , $cái này]
  3. Các đặc điểm có thể được kết hợp. một đặc điểm có thể sử dụng các đặc điểm khác. Điều này cho phép bạn xác định các kết hợp đặc điểm khác nhau mà không cần các câu lệnh bao gồm phức tạp

Đặc điểm có thể chứa gì?

Các đặc điểm PHP có thể chứa nhiều phần tử của một lớp PHP

Bao gồm

  • Các phương thức và thuộc tính với các toán tử hiển thị [công khai, được bảo vệ, riêng tư]
  • Các phương thức và thuộc tính tĩnh
  • Toán tử lớp, chẳng hạn như cha. , bản thân. và $này

Ví dụ

trait SayGreeting {
   /* A public property */
   public $info;
   
   /* A protected property */
   protected $language;
   
   /* A private property */
   private $name = 'my name';
   
   /* A static property */
   public static $count = 0;
   
   /* A public method */
   public function sayHello[] {
       echo 'Hello, I\'m ' . $this->name;
   }
   
   /* A private method */
   private function sayGoodbye[] {
	   echo 'Goodbye!';
   }
   
   /* A static method */
   public static function printCount[] {
	   echo 'Class count: ' . self::$count;
   }
}
class MyClass {
   use SayGreeting;
}
$myClass = new MyClass[];
$myClass->sayHello[]; // Prints: "Hello, I'm Alex";
MyClass::$count = 5;
MyClass::printCount[]; // Prints: "Class count: 5"
$myClass->sayGoodbye[]: // Fatal error: private method.

Các đặc điểm cũng hỗ trợ các phương thức trừu tượng

Các phương thức trừu tượng phải được triển khai bởi lớp sử dụng đặc điểm

trait SayGreeting {
   abstract public function sayHello[];
}
class MyClass {
   use SayGreeting;
   
   /* Must implement the abstract sayHello[] method */
   public function sayHello[] {
      echo 'Hello!';
   }
}
$myClass = new MyClass[];
$myClass->sayHello[]; // Prints: "Hello!";

Đặc điểm cũng có thể sử dụng các đặc điểm khác

Trong trường hợp này, tất cả mã từ các đặc điểm đã sử dụng được đưa vào đặc điểm đó, sau đó vào các lớp sử dụng đặc điểm đó

Ví dụ

trait SayHello {
   
   public function sayHello[] {
      
      echo 'Hello!';
   }
}
trait SayGoodbye {
   
   public function sayGoodbye[] {
      
      echo 'Goodbye!';
   }
}
/* The SayGreeting trait uses the SayHello and SayGoodbye traits */
trait SayGreeting {
   
   use SayHello, SayGoodbye;
}
/* By using SayGreeting, the methods from SayHello and SayGoodbye are included */
class MyClass {
   
   use SayGreeting;
}
$myClass = new MyClass[];
$myClass->sayHello[]; // Prints: "Hello!";
$myClass->sayGoodbye[]; // Prints: "Goodbye!";

phương pháp ưu tiên

Khi bạn sử dụng một đặc điểm trong lớp của mình, lớp sẽ nhận các phương thức từ đặc điểm đó

Bạn có thể ghi đè lên một phương thức đặc điểm bằng cách xác định lại nó trong lớp. Trong trường hợp này, phương thức riêng của lớp được ưu tiên hơn phương thức của đặc điểm

Ví dụ

trait SayHello {
   
   public function sayHello[] {
      
      echo 'Hello!';
   }
}
class MyClass {
   
   use SayHello;
   
   /* Override the trait's method */
    public function sayHello[] {
      
      echo 'Hello from the class!';
   }
}

$myClass = new MyClass[];
$myClass->sayHello[]; // Prints: "Hello from the class!";

Nếu lớp của bạn mở rộng một lớp cơ sở, các phương thức từ các đặc điểm được ưu tiên hơn các phương thức của lớp cơ sở có cùng tên

Tuy nhiên, bạn có thể truy cập các phương thức của lớp cơ sở bằng cách sử dụng lớp cha. nhà điều hành

Ví dụ

________số 8

Phương pháp răng cưa và xung đột

Đặc điểm PHP hỗ trợ răng cưa

Khi bạn sử dụng một đặc điểm trong một lớp, bạn có thể đặt bí danh cho phương thức của một đặc điểm để thay đổi tên và mức độ hiển thị của nó

Điều này được thực hiện bằng cách sử dụng từ khóa as

Ví dụ

trait SayHello {
   
   private function sayHello[] {
      
      echo 'Hello!';
   }
}
class MyClass {
   
   /* Change sayHello[] to hello[] and make it public */
   use SayHello {sayHello as public hello; }
}
$myClass = new MyClass[];
$myClass->hello[]; // Prints: "Hello!"; 

xung đột

Nếu bạn sử dụng nhiều đặc điểm hơn trong cùng một lớp và một phương thức có cùng tên tồn tại trong nhiều đặc điểm, thì bạn có xung đột

PHP không biết nên sử dụng phương thức nào và bạn phải giải quyết xung đột một cách rõ ràng

Để làm điều đó, bạn phải chọn phương pháp nào sẽ giữ lại bằng cách sử dụng từ khóa insteadof

Ví dụ

class MyClass {
   use SayGreeting;
}
0

Bạn vẫn có thể truy cập phương thức ẩn bằng cách sử dụng răng cưa

Như thế này

class MyClass {
   use SayGreeting;
}
1

Đặc điểm thực hành tốt

Dưới đây là 2 lời khuyên để sử dụng các đặc điểm một cách chính xác

1. Không sử dụng các đặc điểm thay vì giao diện

Khi bạn đã quen thuộc với các đặc điểm, chúng sẽ trở nên rất dễ sử dụng. Và bạn có thể bị cám dỗ để lạm dụng chúng

Các cấu trúc khác, chẳng hạn như giao diện và lớp trừu tượng, là lựa chọn tốt hơn trong một số trường hợp

Chẳng hạn, các giao diện sẽ tốt hơn khi bạn muốn chia sẻ một tập hợp các chức năng giữa các lớp tương tự. Và các lớp trừu tượng là lựa chọn tốt hơn khi bạn muốn thực thi việc gõ

Vì vậy, hãy chắc chắn sử dụng cấu trúc tốt nhất ngay cả khi các đặc điểm trông đơn giản hơn và nhanh hơn để thực hiện

2. Giữ đặc điểm của bạn nhỏ

Tốt hơn là giữ các đặc điểm nhỏ và tập trung vào một bộ chức năng duy nhất. Điều này làm cho việc sử dụng chúng trong các lớp học của bạn dễ dàng hơn và duy trì chúng

Nếu bạn muốn tạo một bộ chức năng đầy đủ hơn, bạn có thể tạo một đặc điểm sử dụng các đặc điểm khác

Ví dụ

class MyClass {
   use SayGreeting;
}
2

Điều này giúp bạn linh hoạt hơn trong việc sử dụng các đặc điểm trong các lớp học của mình

Ví dụ

class MyClass {
   use SayGreeting;
}
3

Phần kết luận

Bạn đã thấy cách PHP Traits là một cách để sử dụng lại cùng một mã trong các lớp khác nhau

Bạn cũng đã học cách thức và thời điểm sử dụng chúng cũng như cách chúng so sánh với các giao diện, lớp trừu tượng và tập lệnh “bao gồm”

Bạn đã biết về đặc điểm?

Thuộc tính lớp có thể trừu tượng trong PHP không?

PHP có các lớp và phương thức trừu tượng. Các lớp được định nghĩa là trừu tượng không thể được khởi tạo và bất kỳ lớp nào chứa ít nhất một phương thức trừu tượng cũng phải là trừu tượng. Các phương thức được định nghĩa là trừu tượng chỉ cần khai báo chữ ký của phương thức; .

Chúng ta có thể khởi tạo đặc điểm trong PHP không?

Không thể tự khởi tạo một Đặc điểm . Nó là một bổ sung cho sự kế thừa truyền thống và cho phép cấu thành hành vi theo chiều ngang; .

Cách gọi phương thức trừu tượng trong PHP?

Để khai báo một lớp là trừu tượng, chúng ta cần thêm từ khóa trừu tượng vào trước tên của lớp. Chúng tôi đặt các phương thức trừu tượng cũng được khai báo bằng từ khóa trừu tượng trong lớp trừu tượng . Các phương thức trừu tượng bên trong một lớp trừu tượng không có phần thân, chỉ có tên và tham số bên trong dấu ngoặc đơn.

Làm cách nào để ghi đè lớp trừu tượng trong PHP?

Quy tắc Trừu tượng hóa . Các đối số cho các phương thức phải giống như phương thức trừu tượng. Chẳng hạn, trong ví dụ trên, myMethod2 có hai đối số. $name và $age. Phương thức myMethod2 trong lớp con phải có cùng đối số. The child class should override [redeclare] all the abstract methods. The arguments for methods should be the same as the abstract method. For instance, in the above example, myMethod2 has two arguments: $name and $age . The method myMethod2 in the child class should have the same arguments.

Chủ Đề