Giao diện CÓ THỂ có các thuộc tính trong PHP không?

Một giao diện PHP xác định một hợp đồng mà một lớp phải thực hiện. Nếu một lớp PHP là bản thiết kế cho các đối tượng, thì một giao diện là bản thiết kế cho các lớp. Bất kỳ lớp nào triển khai một giao diện nhất định đều có thể có hành vi giống nhau về những gì có thể được gọi, cách gọi và những gì sẽ được trả về

Trong một bài viết trước, tôi đã nói về các lớp PHP. Trên cơ sở đó, hôm nay chúng ta sẽ nói về giao diện

Khái niệm cơ bản về giao diện PHP

Đối với một ví dụ về những điều cơ bản về Giao diện PHP, chúng tôi sẽ xem xét "thứ gì đó phát ra âm thanh". Trong thế giới thực, đây có thể là một con chim ("tweet"), một con chó ("sủa"), một con mèo ("meo meo") hoặc một con người ("hát"). Chi tiết về cách xưng hô là đặc trưng của từng loại, nhưng mỗi loại có thể phát âm

Chúng ta có thể mô tả điều này như sau

interface Vocalizer
{
    public function vocalize(string $message): string;
}

Những gì chúng tôi đang nói ở trên là. đưa ra một chuỗi $message, vocalize() sẽ trả về những gì nghe được dưới dạng một chuỗi

Bây giờ, một giao diện không tự làm bất cứ điều gì. Tuy nhiên, nó hoạt động như một kiểu PHP. Điều này có nghĩa là bạn có thể nhập gợi ý vào nó làm đối số hoặc thậm chí trả về nội dung nào đó thuộc loại đó từ một hàm hoặc phương thức

Để tạo một cái gì đó thuộc loại đó, chúng ta cần có sẵn một triển khai. Các lớp có thể thực hiện một giao diện

class Bird implements Vocalizer
{
    public function vocalize(string $message): string
    {
        return sprintf('<tweet>%s</tweet>', $message);
    }
}

Giả sử chúng ta có một chức năng như sau

function prepareMessage(string $message, Vocalizer $vocalizer): string
{
    return $vocalizer->vocalize($message);
}

Hàm trên có thể được gọi với bất kỳ $vocalizer nào triển khai Vocalizer

$chickadee = new Bird();
echo prepareMessage('a song', $chickadee); // "<tweet>a song</tweet>"

 

Kế thừa và thay thế

Tóm lại, giao diện cung cấp cho chúng tôi cách cung cấp các tính năng mà không yêu cầu kế thừa lớp. Điều này có thể thực sự hữu ích để điều chỉnh các lớp hiện có để hoạt động trong các ngữ cảnh khác.
Ví dụ, giả sử chúng ta đã có một lớp Bird không triển khai Vocalizer, nhưng về cơ bản chúng ta có chức năng tương đương thông qua một phương thức tweet().

class Bird
{
    public function tweet(string $message): string
    {
        return sprintf('<tweet>%s</tweet>', $message);
    }
}

Chúng tôi có thể thực hiện một trong hai điều để biến lớp này thành Trình phát âm vào thời điểm này, trong khi vẫn giữ tất cả các chức năng hiện có

Đầu tiên, chúng ta có thể cập nhật lớp để triển khai trực tiếp giao diện Vocalizer

class Bird implements Vocalizer
{
    public function vocalize(string $message): string
    {
        return $this->tweet($message);
    }

    public function tweet(string $message): string
    {
        return sprintf('<tweet>%s</tweet>', $message);
    }
}

Ngoài ra, chúng ta có thể tạo một tiện ích mở rộng của Bird thực hiện Vocalizer

class VocalizingBird extends Bird implements Vocalizer
{
    public function vocalize(string $message): string
    {
        return $this->tweet($message);
    }
}

Bởi vì cái sau này là một phần mở rộng của Bird, nó đáp ứng loại Bird cho gợi ý đánh máy; . Bạn cũng có thể thực hiện những điều trên thông qua triển khai lớp ẩn danh

$bird = new class extends Bird implements Vocalizer {
    public function vocalize(string $message): string
    {
        return $this->tweet($message);
    }
};

Điều này dẫn chúng ta đến một lý do chính để sử dụng các giao diện. khả năng thay thế một loại cho một loại khác

Năm nguyên tắc lập trình hướng đối tượng

Khi thực hiện lập trình hướng đối tượng, có một bộ năm nguyên tắc thiết kế cốt lõi được khuyến nghị để tạo ra các kiến ​​trúc linh hoạt, có thể bảo trì được gọi là các nguyên tắc RẮN

•      Nguyên tắc đơn trách nhiệm
•      Nguyên tắc mở-đóng
•    Nguyên tắc thay thế Liskov
•    Nguyên tắc phân biệt giao diện
•    Dependency inversion principle

Nguyên tắc đảo ngược phụ thuộc

Điều tôi muốn chỉ ra ở đây là nguyên tắc nghịch đảo phụ thuộc

Nguyên tắc đảo ngược phụ thuộc nói rằng chúng ta nên phụ thuộc vào sự trừu tượng, chứ không phải việc triển khai. Điều đó nghĩa là gì?

Nếu chúng ta chỉ lo lắng về tiếng kêu, chúng ta không cần phải lo lắng về việc chúng ta có Chim, Người hay Thú hay không. Chúng ta nên lo lắng về việc liệu chúng ta có thứ gì đó có khả năng phát âm hay không.  

Các giao diện cho phép chúng tôi xác định các khả năng này và sau đó cho phép mã của chúng tôi đánh máy theo các khả năng đó chứ không phải một loại cụ thể hơn. Điều này đến lượt nó cho phép chúng tôi thay thế các loại khác nhau khi chúng hoàn thành hợp đồng được xác định bởi giao diện

Lỗi Thường Gặp Khi Thực Hiện Lập Trình Hướng Đối Tượng

Một sai lầm phổ biến khi bắt đầu thực hiện lập trình hướng đối tượng là tạo cây thừa kế chặt chẽ. một lớp cơ sở, sau đó là các kiểu con của lớp cơ sở đó, rồi các triển khai của các kiểu con đó, v.v.  

Điều này có thể dẫn đến việc tạo ra một lớp về mặt kỹ thuật có hàng chục hành vi khác nhau trở lên, nhưng chỉ được sử dụng cho một trong số chúng. Bằng cách chia nhỏ các hành vi này thành các giao diện khác nhau, chúng ta có thể tạo các lớp chỉ thực hiện các hành vi cụ thể và sử dụng chúng ở bất cứ nơi nào cần đến các hành vi đó.

Chúng ta có thể định nghĩa gì trong một giao diện PHP?

Bây giờ chúng ta đã có ý tưởng cơ bản về giao diện là gì, tại sao chúng ta có thể sử dụng một giao diện và cách chúng ta có thể triển khai một giao diện?

Giao diện trong PHP được giới hạn ở.
•    Các phương thức hiển thị công khai.
•    Hằng số hiển thị công khai.

Trong bài viết trước của chúng tôi về các lớp PHP, chúng tôi đã lưu ý rằng khả năng hiển thị là một chủ đề nâng cao hơn. Nó vẫn vậy, nhưng chúng ta có thể bao gồm một số điều cơ bản. Tóm lại, khả năng hiển thị giúp nêu chi tiết những gì có thể sử dụng chức năng và ở đâu. Một cái gì đó có khả năng hiển thị công khai có thể được truy cập cả trong các phương thức của lớp, cũng như từ các thể hiện. Cái sau có nghĩa là gì?

________số 8

$chickadee là một ví dụ

lạc đề. Hằng số lớp

Trong bài viết về các lớp, chúng tôi không đề cập đến các hằng số của lớp. Một hằng số lớp giống như một hằng số PHP bình thường ở chỗ nó mô tả chi tiết một giá trị không đổi. Đó là một giá trị không thể được chỉ định lại sau này. Để khai báo một hằng số lớp, bạn sử dụng từ khóa const trong khai báo lớp của mình và tùy chọn toán tử khả năng hiển thị (như thuộc tính và phương thức, khả năng hiển thị mặc định là công khai)

class Bird
{
    public const TAXONOMY_CLASS = 'aves';
}

Sau đó, bạn tham khảo cách sử dụng tên lớp và tên hằng, cách nhau bởi

class Bird implements Vocalizer
{
    public function vocalize(string $message): string
    {
        return sprintf('<tweet>%s</tweet>', $message);
    }
}
0

Một hằng số lớp có thể là bất kỳ kiểu vô hướng nào, hoặc một mảng, miễn là không có phần tử nào của mảng là đối tượng. Họ thậm chí có thể tham khảo các hằng số khác nếu cần

Theo quy ước, tên hằng thường viết HOA, sử dụng dấu phân cách gạch dưới

Các hằng số được xác định trên một giao diện được kế thừa bởi tất cả các triển khai

Khi định nghĩa một phương thức trên một giao diện, bạn bỏ qua phần thân và các dấu ngoặc của nó, thay vào đó kết thúc phần khai báo bằng dấu chấm phẩy (;); . Chúng chỉ ra những gì việc triển khai phải xác định để có hiệu lực

Chúng ta đã thấy một định nghĩa phương thức trước đây, khi chúng ta định nghĩa một phương thức vocalize() trên giao diện Vocalizer của mình

class Bird implements Vocalizer
{
    public function vocalize(string $message): string
    {
        return sprintf('<tweet>%s</tweet>', $message);
    }
}
1

Như vậy, bất kỳ triển khai nào cũng phải xác định phương thức này và tương thích. Họ có thể thêm nhiều đối số hơn — nhưng chỉ khi những đối số đó là tùy chọn. Đó là cách duy nhất họ có thể khác nhau

Khả năng thực hiện nhiều kế thừa

Một tính năng mà một số ngôn ngữ cung cấp là đa kế thừa. Tính năng này cho phép một đối tượng mở rộng nhiều loại khác và do đó đáp ứng tất cả. Ví dụ, một lớp Ngựa có thể mở rộng cả lớp Động vật và Xe

PHP không cung cấp đa kế thừa, ít nhất là không trực tiếp. Tuy nhiên, những gì nó cung cấp là khả năng triển khai nhiều giao diện. Điều này có thể hữu ích đặc biệt khi bạn muốn mô tả một tập hợp con các tính năng mà một lớp cụ thể cung cấp trong một ngữ cảnh nhất định.  

Ví dụ về triển khai nhiều giao diện

Ví dụ: gói laminas/laminas-cache xác định nhiều giao diện mô tả khả năng của bộ điều hợp lưu trữ, bao gồm FlushableInterface, OptimizableInterface, ClearByPrefixInterface, TaggableInterface, v.v. Các bộ điều hợp riêng lẻ đều là bộ điều hợp lưu trữ, nhưng chúng có thể cho biết chúng có các khả năng khác bằng cách triển khai các giao diện này

Để triển khai nhiều giao diện, bạn cung cấp một danh sách các giao diện được phân tách bằng dấu phẩy theo sau từ khóa implements khi khai báo lớp của bạn

class Bird implements Vocalizer
{
    public function vocalize(string $message): string
    {
        return sprintf('<tweet>%s</tweet>', $message);
    }
}
2

Sau đó, một thể hiện của lớp này sẽ hoàn thành các gợi ý đánh máy đối với từng giao diện này

Đặt tên giao diện PHP

Bạn nên đặt tên cho giao diện của mình như thế nào? . Theo ví dụ của chúng tôi, chúng tôi đang xác định thứ gì đó phát ra âm thanh, vì vậy chúng tôi đặt tên cho giao diện là Bộ phát âm

Điều này có thể khó hình dung, đặc biệt nếu bạn trích xuất một giao diện từ một lớp mà bạn đã định nghĩa trước đó, trong đó tên logic đã là tên của một lớp hiện có (e. g. , bạn có thể muốn xác định giao diện Logger, nhưng lớp Logger đã tồn tại).  

Đôi khi khó khăn trong việc đặt tên là do có một nhóm các nhà phát triển từ các nền tảng hoặc quốc gia khác nhau (ví dụ:. g. , một số thành viên trong nhóm có thể không chia sẻ cùng một ngôn ngữ mẹ đẻ). Do đó, nhiều dự án sử dụng hậu tố Giao diện để đơn giản hóa quyết định đặt tên, cũng như gọi ra tệp lớp nào trong dự án là hợp đồng so với triển khai

Bạn và nhóm của bạn nên quyết định cách tiếp cận nào phù hợp nhất với bạn

Bước tiếp theo

Giao diện PHP cung cấp các loại có thể sử dụng lại chi tiết các hành vi cụ thể mà ứng dụng của bạn có thể sử dụng. Đặc biệt, chúng cho phép bạn tạo các lớp có các hành vi đã biết, dự kiến ​​phù hợp với kiến ​​trúc ứng dụng của riêng bạn. Các giao diện PHP cũng cho phép bạn thay thế các triển khai khác nhau, bất kể kế thừa lớp thông thường, giúp bạn linh hoạt hơn trong cách cấu trúc các ứng dụng của mình

bài viết này hầu như không đầy đủ. Zend by Perforce có một số tài nguyên giúp bạn tìm hiểu thêm về lập trình hướng đối tượng bằng ngôn ngữ PHP. Kiểm tra các lựa chọn đào tạo của chúng tôi ở đây

Các thuộc tính có được phép trong giao diện không?

Một giao diện có thể xác định cách triển khai mặc định cho các thành viên, bao gồm các thuộc tính . Việc xác định triển khai mặc định cho thuộc tính trong giao diện là rất hiếm vì giao diện có thể không xác định trường dữ liệu mẫu.

Giao diện có thể có biến trong PHP không?

Một giao diện có thể chứa các phương thức và hằng, nhưng không được chứa bất kỳ biến nào .

Các thuộc tính của một giao diện là gì?

Mã byte của một giao diện xuất hiện trong một. .
Bạn không thể khởi tạo một giao diện
Một giao diện không chứa bất kỳ hàm tạo nào
Tất cả các phương thức trong một giao diện đều trừu tượng
Một giao diện không thể chứa các trường thể hiện. .
Một giao diện không được mở rộng bởi một lớp;

Chúng ta có thể tạo đối tượng giao diện trong PHP không?

Giao diện là một tính năng quan trọng của lập trình hướng đối tượng nhờ đó có thể chỉ định các phương thức sẽ được thực hiện bởi một lớp mà không cần phải xác định cách thực hiện chúng. PHP hỗ trợ giao diện theo cách nếu từ khóa giao diện . Giao diện tương tự như lớp nhưng với các phương thức không có phần thân định nghĩa.