Giao diện trừu tượng PHP

Các lớp trừu tượng là khi lớp cha chứa một phương thức tên, nhưng nó cần lớp con của nó để chạy các tác vụ đó. Trong lớp Trừu tượng có ít nhất một phương thức trừu tượng. Các phương thức trừu tượng chỉ có thể được khai báo trong một lớp trừu tượng nhưng không thể được triển khai trong mã. Các lớp trừu tượng có thể được khai báo với sự trợ giúp của các từ khóa trừu tượng

Cú pháp cho một lớp trừu tượng-

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
8

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
9

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
0

Đặc điểm của một lớp trừu tượng

  • Lớp trừu tượng không thể được khởi tạo trực tiếp có nghĩa là chúng ta không thể tạo các đối tượng của một lớp trừu tượng, chúng chỉ có thể được kế thừa
  • Cả thành viên trừu tượng và không trừu tượng đều có thể là một phần của lớp trừu tượng
  • Một phương thức trừu tượng phải được khai báo trong lớp trừu tượng
  • Các lớp trừu tượng luôn được công khai

Sự khác biệt giữa Lớp trừu tượng và Giao diện

Abstract ClassInterfaceAbstract Class không hỗ trợ nhiều kế thừa. Giao diện hỗ trợ nhiều kế thừa. Chúng chứa các thành viên dữ liệuChúng không chứa các thành viên dữ liệu. Một lớp trừu tượng chứa cả thành viên trừu tượng và không trừu tượng. Giao diện chỉ chứa các thành viên trừu tượng. Lớp trừu tượng chứa các hàm tạo. Chúng không chứa hàm tạo. Toàn bộ thành viên của một lớp trừu tượng có thể là tĩnhCác thành viên của giao diện không thể là tĩnh. Nó chứa các công cụ sửa đổi truy cập cho phụ, chức năng và thuộc tính. Nó không truy cập công cụ sửa đổi, theo mặc định, mọi thứ đều công khai

Giao diện trong PHP

Với sự trợ giúp của giao diện, người dùng có thể tạo các chương trình và trợ giúp trong việc chỉ định các phương thức công khai được triển khai bởi một lớp, bằng cách ẩn đi độ phức tạp và chi tiết về cách các phương thức cụ thể được triển khai. Điều này thường được gọi là mức độ trừu tượng tiếp theo. Chúng ta có thể định nghĩa giao diện giống như một lớp, điểm khác biệt duy nhất là từ khóa lớp được thay thế bằng từ khóa giao diện

Cú pháp của một giao diện-

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
1

Đặc điểm của một giao diện

  • Nó bao gồm các phương thức không có triển khai có nghĩa là chúng là các phương thức trừu tượng
  • Tất cả các phương thức chứa phạm vi hiển thị công khai
  • Chúng khác với lớp vì lớp có thể kế thừa từ một lớp, mặt khác, lớp có thể thực hiện một hoặc nhiều giao diện

Phần kết luận

Các giao diện và các lớp trừu tượng hoàn toàn khác nhau, không thể thay thế hoặc sử dụng các lựa chọn thay thế của nhau. Các giao diện giống như các lớp vỏ trống mong đợi các lớp con thực hiện mọi thứ cho chúng trong khi lớp trừu tượng không chỉ chứa các mẩu thông tin chung mà còn mong đợi các lớp con lấp đầy các khoảng trống còn lại giữa chúng. Tóm lại- Một lớp trừu tượng cho phép người dùng tạo chức năng mà các lớp con có thể triển khai hoặc ghi đè và giao diện chỉ cho phép người dùng xác định chức năng nhưng chúng ta có thể triển khai nó

Có thể thấy, chúng ta đang mở rộng

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
1 với ba giao diện khác là
class Class_A { }

abstract class MyAbstractClass extends Class_A { }
2,
class Class_A { }

abstract class MyAbstractClass extends Class_A { }
2 và
class Class_A { }

abstract class MyAbstractClass extends Class_A { }
4

Bây giờ chúng ta hãy thử mở rộng một

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
8

class Class_A { }

abstract class MyAbstractClass extends Class_A { }

Không có vấn đề gì, bạn CÓ THỂ mở rộng một lớp trừu tượng với chính xác một lớp nhưng nếu bạn cố gắng thêm một lớp nữa

class Class_A { }
class Class_B { }

abstract class MyAbstractClass extends Class_A, Class_B { }

Lần này PHP sẽ báo cho bạn một lỗi lạ mà không cho bạn biết bạn đang làm gì sai

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
6

Tôi ước PHP sẽ đưa ra thông báo giống như vậy [hy vọng PHP sẽ đưa ra thông báo lỗi thông minh hơn trong các phiên bản sau]

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
7

Interface does'n Contains Data Member | Abstract class contains Data Member

Bởi các thành viên dữ liệu, nó có nghĩa là các thuộc tính hoặc biến của lớp. Vì vậy, bạn không thể thêm thành viên dữ liệu vào giao diện

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
0

Vì vậy, trong một giao diện, chỉ có thể cung cấp sơ khai phương thức

Tuy nhiên, bạn có thể thêm các thành viên dữ liệu vào một lớp trừu tượng, tất nhiên đây là mã hợp lệ

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
1
class Class_A { }

abstract class MyAbstractClass extends Class_A { }
2

Có vẻ như điểm này có thể áp dụng cho các ngôn ngữ khác nhưng trong PHP, một giao diện CÓ THỂ có trình bao tạo trống

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
3

Giống như các ngôn ngữ khác, PHP không nên cho phép có hàm tạo bên trong giao diện. Nhưng dù sao đi nữa, nó không có nhiều ý nghĩa ở đây và dù sao cũng nên tránh

Mặt khác, một lớp trừu tượng có thể chứa phương thức khởi tạo

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
4

Ở đây hàm tạo được gọi là

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
8 và do đó sử dụng các lớp con để bổ sung cho nó. Tuy nhiên, bạn cũng có thể có mã khởi tạo chung trong hàm tạo của một lớp trừu tượng, trong trường hợp đó, bạn cần xóa từ khóa
class Class_A { }

abstract class MyAbstractClass extends Class_A { }
8 và cung cấp phần thân cho nó

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
0
interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
1

Điều này đơn giản có nghĩa là một giao diện chỉ có thể chứa sơ khai phương thức chứ không phải triển khai của chúng. Điều này khá giống với điểm thứ hai trong hình trên. Đây là lý do tại sao trong các phương thức của giao diện, chúng không có phần thân được đánh dấu bằng dấu ngoặc nhọn

class Class_A { }
class Class_B { }

abstract class MyAbstractClass extends Class_A, Class_B { }
0. Vì vậy, một giao diện hoàn toàn trống rỗng, thực thi một số quy tắc mà các lớp con phải thực hiện và đó là nó

Các lớp trừu tượng có thể có cả hai; . Nói chung, sơ khai phương thức trống được bắt đầu bằng từ khóa

class Class_A { }

abstract class MyAbstractClass extends Class_A { }
8 để các lớp con phải cung cấp chi tiết triển khai của chúng. Nhưng một lớp trừu tượng cũng có thể chứa đầy đủ triển khai phương thức bên trong nó, thường được sử dụng cho phần chức năng chung mà mỗi lớp con có thể cần. Ví dụ

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
2

Trong đoạn mã trên, chúng ta có thể thấy rằng lớp

class Class_A { }
class Class_B { }

abstract class MyAbstractClass extends Class_A, Class_B { }
2 có một phương thức
class Class_A { }

abstract class MyAbstractClass extends Class_A { }
8 có tên là
class Class_A { }
class Class_B { }

abstract class MyAbstractClass extends Class_A, Class_B { }
4 vì mỗi lớp con [động vật] có cách tìm con mồi riêng và một phương thức được triển khai đầy đủ có tên là
class Class_A { }
class Class_B { }

abstract class MyAbstractClass extends Class_A, Class_B { }
5 vì tất cả các loài động vật đều có thể chạy, điều này không cần thiết . Vì vậy, ở đây phương thức
class Class_A { }
class Class_B { }

abstract class MyAbstractClass extends Class_A, Class_B { }
5 được triển khai đầy đủ và đại diện cho dữ liệu chung cần được chia sẻ giữa các lớp con

Lưu ý rằng ngoài các phương thức phổ biến được triển khai đầy đủ bên trong một lớp trừu tượng, bạn cũng có thể có các thành viên dữ liệu chung, ví dụ như các biến cần được chia sẻ giữa các lớp con

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
3

Theo công cụ sửa đổi truy cập, chúng tôi muốn nói đến khả năng thay đổi phạm vi bằng cách sử dụng các từ khóa như

class Class_A { }
class Class_B { }

abstract class MyAbstractClass extends Class_A, Class_B { }
7,
class Class_A { }
class Class_B { }

abstract class MyAbstractClass extends Class_A, Class_B { }
8 và
class Class_A { }
class Class_B { }

abstract class MyAbstractClass extends Class_A, Class_B { }
9. Chúng tôi không thể sử dụng chúng cho các giao diện nhưng chúng tôi có thể sử dụng chúng cho mọi thứ trong các lớp trừu tượng

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
4

Điều này một lần nữa có thể thực hiện được trong PHP [kể từ bây giờ với PHP 5. 4] không giống như các ngôn ngữ khác, vì vậy bạn CÓ THỂ làm

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
5

Lưu ý thêm từ khóa

Interface does'n Contains Data Member | Abstract class contains Data Member
0 để đánh dấu nó là phương thức tĩnh

Đối với lớp trừu tượng, bạn có thể có các thành viên tĩnh cũng như các phương thức được triển khai trong lớp trừu tượng

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
6

Nhưng bạn không thể có một phương thức vừa là

Interface does'n Contains Data Member | Abstract class contains Data Member
0 vừa là
class Class_A { }

abstract class MyAbstractClass extends Class_A { }
8, vì vậy bạn không thể làm điều này, điều này phổ biến trên các ngôn ngữ

interface Interface_A { }
interface Interface_B { }
interface Interface_C { }

interface MyInterface extends Interface_A, Interface_B, Interface_C { }
7

Tóm lại, các lớp giao diện và lớp trừu tượng hoàn toàn khác nhau, bạn không thể hoán đổi chúng hoặc sử dụng cái này thay thế cho cái kia. Các giao diện là các shell hoàn toàn trống rỗng mong muốn các lớp con thực hiện mọi thứ cho chúng. Mặt khác, lớp trừu tượng không chỉ có thể chứa các mẩu thông tin chung bằng cách triển khai bên trong chúng mà còn mong đợi các lớp con điền vào các khoảng trống còn lại

Chủ Đề