Đặc điểm là cách nó được sử dụng trong PHP là gì?

Sự khác biệt chính giữa Đặc điểm và Giao diện trong PHP là Đặc điểm xác định cách triển khai thực tế của từng phương thức trong mỗi lớp, vì vậy nhiều lớp triển khai cùng một giao diện nhưng có hành vi khác nhau, trong khi đặc điểm chỉ là các đoạn mã được đưa vào một lớp trong PHP

đặc điểm

Các đặc điểm hoàn toàn không phải là giao diện. Các đặc điểm có thể xác định cả thành viên tĩnh và phương thức tĩnh. Nó giúp các nhà phát triển sử dụng lại các phương thức một cách tự do trong một số lớp độc lập trong các hệ thống phân cấp lớp khác nhau. Các đặc điểm làm giảm độ phức tạp và tránh các vấn đề liên quan đến đa kế thừa và Mixins. Lưu ý rằng PHP không cho phép đa kế thừa. Vì vậy, Đặc điểm được sử dụng để đáp ứng khoảng trống này bằng cách cho phép chúng tôi sử dụng lại chức năng giống nhau trong nhiều lớp

cú pháp




// A sample trait in PHP

trait namethis {

    function ReturnType() {  }

    function

ExampleMethod1 Called
ExampleMethod2 Called
1

ExampleMethod1 Called
ExampleMethod2 Called
2

Đặc điểm không thể thực hiện giao diện. Một đặc điểm cho phép cả hai lớp sử dụng nó cho yêu cầu giao diện chung. Nó hỗ trợ việc sử dụng các phương thức trừu tượng. Nó cho phép cấu thành hành vi theo chiều ngang đối với kế thừa truyền thống. Các đặc điểm là một cơ chế để tái sử dụng mã trong các ngôn ngữ kế thừa đơn lẻ như PHP. Viết lại cùng một mã, để tránh điều này, hãy sử dụng các đặc điểm. Các đặc điểm được sử dụng khi nhiều lớp có cùng chức năng

Thí dụ




ExampleMethod1 Called
ExampleMethod2 Called
4

ExampleMethod1 Called
ExampleMethod2 Called
5

trait

ExampleMethod1 Called
ExampleMethod2 Called
7

    

ExampleMethod1 Called
ExampleMethod2 Called
9 function 1

2_______13_______3 45

    7

7

9

// A sample trait in PHP0 // A sample trait in PHP1

    // A sample trait in PHP3 // A sample trait in PHP4

    

ExampleMethod1 Called
ExampleMethod2 Called
9 function 1

2_______13_______3 trait15

    7

7

9

trait7 trait8trait9 namethis {0

trait7namethis {2

namethis {3

đầu ra

Hello Geeks!

giao diện

Nó chỉ định danh sách tất cả các phương thức mà một lớp phải thực hiện. Sử dụng từ khóa Giao diện để triển khai giao diện giống như một lớp. Nó có thể mở rộng một giao diện bằng cách sử dụng toán tử mở rộng. Tất cả các phương thức trong Giao diện là các phương thức trừu tượng và có thể có hằng số riêng. Có một khái niệm lớp cụ thể là một lớp thực hiện một giao diện phải thực hiện tất cả các phương thức có cùng tên và chữ ký
Tất cả các phương thức trong giao diện phải có cấp truy cập công khai

cú pháp




namethis {5

namethis {6 namethis {7

namethis {8

9    0

7

Không có hai giao diện nào có thể được triển khai bởi một lớp cụ thể có cùng tên phương thức và chữ ký vì nó gây ra lỗi. Cũng giúp đa kế thừa vì một lớp có thể triển khai nhiều giao diện trong khi nó chỉ có thể mở rộng một lớp. Việc triển khai có thể được thay đổi mà không ảnh hưởng đến người gọi giao diện

Dù sao, trong thực tế, tôi luôn tìm thấy những lựa chọn thay thế tốt hơn để sử dụng một đặc điểm. Như một ví dụ, đây là một số lựa chọn thay thế

  • Nếu đặc điểm có trách nhiệm dịch vụ, thì tốt hơn là biến nó thành một dịch vụ thực tế, có thể và nên được đưa vào làm đối số hàm tạo vào dịch vụ yêu cầu dịch vụ này. Điều này được gọi là hành vi soạn thảo, thay vì hành vi kế thừa. Cách tiếp cận này cũng có thể được sử dụng khi bạn muốn loại bỏ các lớp cha
  • Nếu đặc điểm thêm một số hành vi vào một thực thể giống với thực thể khác, thì việc giới thiệu một đối tượng giá trị và sử dụng nó thay thế thường là hợp lý.
  • Một tùy chọn khác khi bạn có cùng hành vi trong các phần khác nhau của mô hình, là chỉ cần sao chép mã. Điều này sẽ giữ cho thiết kế của từng đối tượng đủ linh hoạt để mỗi đối tượng có thể phát triển theo hướng riêng của mình. Khi chúng tôi muốn thay đổi logic, chúng tôi sẽ không phải lo lắng về những nơi khác sử dụng lại cùng một logic

Một phản ví dụ

Mặc dù hầu hết các tình huống không thực sự cần một đặc điểm và luôn có những lựa chọn thay thế tốt hơn, nhưng có một tình huống mà tôi tiếp tục sử dụng một đặc điểm cho. Đây là mã cho đặc điểm đó và nếu bạn đã từng tham dự một trong các hội thảo của tôi, bạn sẽ biết điều đó.

________số 8_______

Tôi sử dụng đặc điểm này trong các thực thể, vì ở đó tôi luôn muốn làm điều tương tự. ghi lại bất kỳ số lượng sự kiện nào, sau đó sau khi lưu trạng thái đã sửa đổi của thực thể, hãy giải phóng các sự kiện đó để gửi chúng đi

Một mối quan tâm có thể là releaseEvents() là một phương thức công khai. Nhưng nó không nhất thiết phải có trên bất kỳ giao diện nào. Chúng tôi không cần giao diện Entity hoặc giao diện RecordsEvents, trừ khi chúng tôi muốn tạo một số mã có thể sử dụng lại để có thể lưu một thực thể và gửi các sự kiện được ghi lại của nó

Một mối quan tâm khác là đặc điểm này bị thiếu "đặc điểm riêng tư". Ví dụ, thay vì sử dụng $this->recordThat(...), một thực thể sử dụng đặc điểm này cũng có thể thực hiện $this->events[] = ...

Chúng tôi có thể khắc phục sự cố này bằng cách trích xuất mã vào một đối tượng, (thêm nhiều bằng chứng hơn cho tuyên bố rằng luôn có một giải pháp thay thế cho việc sử dụng một đặc điểm)

final class EventRecording
{
    /**
     * @var list
     */
    private array $events = [];

    public function recordThat(object $event): void
    {
        // ...
    }

    /**
     * @return list
     */
    public function releaseEvents(): array
    {
        // ...
    }
}

Sau đó, chúng ta cần gán một thể hiện của lớp mới này cho một thuộc tính riêng của thực thể

final class SomeEntity
{
    // Can we do this already? I forgot
    private EventRecording $eventRecording = new EventRecording();

    /**
     * @return list
     */
    public function releaseEvents(): array
    {
        return $this->eventRecording->releaseEvents();
    } 

    // ...
}

Mọi thực thể sẽ vẫn cần phương thức công khai đó releaseEvents() và thuộc tính riêng bổ sung mà chúng tôi sao chép/dán vào từng lớp thực thể mới. Một lần nữa chúng ta có thể giới thiệu một đặc điểm cho điều đó

trait ReleaseEvents
{
    private EventRecording $eventRecording = new EventRecording();

    /**
     * @return list
     */
    public function releaseEvents(): array
    {
        return $this->eventRecording->releaseEvents();
    } 
}

Tại thời điểm này, tôi cảm thấy như lớp

final class EventRecording
{
    /**
     * @var list
     */
    private array $events = [];

    public function recordThat(object $event): void
    {
        // ...
    }

    /**
     * @return list
     */
    public function releaseEvents(): array
    {
        // ...
    }
}
0 được trích xuất dù sao cũng không làm được gì nhiều và có thể được coi là một lớp Lười biếng (mùi mã). Chúng tôi cũng có thể sử dụng đặc điểm ban đầu, chấp nhận các mối quan tâm về thiết kế và hoàn thành. Khỏe

Yêu cầu về đặc điểm

Dựa trên kinh nghiệm của tôi với các đặc điểm (đã xem các ví dụ về chúng trong các dự án, khung và thư viện), tôi không biết trường hợp nào tốt để sử dụng các đặc điểm, vì vậy quy tắc của tôi là không bao giờ sử dụng chúng. Tuy nhiên, bạn có thể có một số ví dụ điển hình về các đặc điểm có ý nghĩa và chỉ có ý nghĩa như một đặc điểm. Vì vậy, đây là Yêu cầu về Đặc điểm của tôi. Hãy chia sẻ ví dụ của bạn bằng cách gửi bình luận

Làm cách nào để bao gồm các đặc điểm trong PHP?

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 . 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.

Khi nào bạn có thể sử dụng các đặc điểm?

Khi nào nên sử dụng Đặc điểm? . Rốt cuộc đó không phải là hành vi có thể tái sử dụng. Nếu nó có thể được sử dụng lại trong nhiều lớp không liên quan, hãy biến nó thành một đặc điểm. If the behavior will not be reused, then make it a concrete class. It is not reusable behavior after all. If it might be reused in multiple, unrelated classes, make it a trait.

Đặc điểm trong lập trình là gì?

Trong lập trình máy tính, đặc điểm là một khái niệm được sử dụng trong lập trình hướng đối tượng đại diện cho một tập hợp các phương thức có thể được sử dụng để mở rộng chức năng của một lớp.

Khi nào đặc điểm được giới thiệu trong PHP?

Các đặc điểm được đưa vào PHP 5. 4 khắc phục vấn đề thừa kế đơn lẻ.