PHP khi nào nên sử dụng giao diện và lớp trừu tượng

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-

abstract class First {
   abstract function printdata();
}

class Second extends First{
    public function printdata() {
        echo 'Best Interview Question';
    }
}

class Third extends First{
    public function printdata() {
        echo 'Hello Best Interview Question Team';
    }
}
$second = new Second();
$third = new Third();
$second->printdata() // Best Interview Question
$third->printdata() // Hello Best Interview Question Team

Đặ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 MyInterfaceName {
   public function methodA();
   public function methodB();
}
class MyFirstClass implements MyInterfaceName{
    public function methodA() {
       echo 'Best Interview Question';
    }
    public function methodB() {
       echo 'Best Interview Question Team';
    }
}

Đặ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ó

lớp trừu tượng

  • Lớp trừu tượng đến dưới sự trừu tượng hóa một phần
  • Các lớp trừu tượng có thể duy trì các phương thức trừu tượng và các phương thức không trừu tượng
  • Trong các lớp trừu tượng, chúng ta có thể tạo các biến
  • Trong các lớp trừu tượng, chúng ta có thể sử dụng bất kỳ trình xác định quyền truy cập nào
  • Bằng cách sử dụng từ khóa 'extends', chúng ta có thể truy cập các tính năng của lớp trừu tượng từ lớp dẫn xuất
  • Nhiều kế thừa là không thể

giao diện

  • Giao diện hoàn toàn trừu tượng
  • Các giao diện chỉ có thể duy trì các phương thức trừu tượng
  • Trong các giao diện, chúng ta không thể tạo các biến
  • Trong giao diện, chúng ta chỉ có thể sử dụng công cụ xác định quyền truy cập công khai
  • Bằng cách sử dụng từ khóa 'triển khai', chúng ta có thể nhận giao diện từ lớp dẫn xuất
  • Bằng cách sử dụng giao diện, nhiều kế thừa là có thể

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

interface MyInterface {
    public $foo = null;
}

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ệ

abstract class MyAbstractClass {
    public $foo = null;
}

Interface does'n contains Constructors | Abstract class contains Constructors

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

interface MyInterface {
    public function __construct();
}

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

abstract class MyAbstractClass {
    abstract public function __construct();
}

Ở đâ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 pháp
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, đây là điều 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à 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

Khi nào chúng ta nên sử dụng giao diện và lớp trừu tượng?

Câu trả lời ngắn. Một lớp trừu tượng cho phép bạn tạo chức năng mà các lớp con có thể thực hiện hoặc ghi đè. Giao diện chỉ cho phép bạn xác định chức năng, không triển khai chức năng đó . Và trong khi một lớp chỉ có thể mở rộng một lớp trừu tượng, nó có thể tận dụng nhiều giao diện.

Trong tình huống nào thì giao diện tốt hơn lớp trừu tượng?

Một giao diện tốt hơn một lớp trừu tượng khi nhiều lớp cần triển khai giao diện . Thành viên của giao diện không thể tĩnh. Thành viên hoàn chỉnh duy nhất của một lớp trừu tượng có thể là tĩnh. C# không hỗ trợ đa thừa kế; .

Tại sao chúng ta nên sử dụng lớp trừu tượng trong PHP?

Chúng tôi sử dụng các lớp trừu tượng khi chúng tôi muốn lập trình viên (chính mình hoặc người khác) viết một phương thức lớp nhất định , nhưng chúng tôi . Lấy một ví dụ, hình tròn, hình chữ nhật, hình bát giác, v.v.