Một lớp trừu tượng là một lớp có í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ã. Lớp kế thừa lớp trừu tượng này cần định nghĩa phương thức đó. Phải có một từ khóa trừu tượng phải được trả về trước lớp này để nó là một lớp trừu tượng. Vì vậy, chúng ta không thể tạo các đối tượng từ các lớp trừu tượng. Thay vào đó, chúng ta cần tạo các lớp con thêm mã vào phần thân của các phương thức và sử dụng các lớp con này để tạo các đối tượng. Có thể có nhiều hơn một phương thức có thể không được xác định
// abstract classGiao diện
abstract class DataAccess { public $varAbstract;
protected $varHost; // this abstract method confirm need to define in child class
abstract function db_connect[]; protected function getResultArray[]{
}}
Hãy nghĩ về một giao diện như một khuôn mẫu hoặc hợp đồng cho các lớp cụ thể của bạn. Lớp hoàn toàn trừu tượng được gọi là giao diện. Bất kỳ lớp nào triển khai giao diện này đều phải sử dụng từ khóa implements và tất cả các phương thức được khai báo trong lớp phải được định nghĩa tại đây. mặt khác, lớp này cũng cần được định nghĩa là trừu tượng. Khi một hoặc nhiều lớp sử dụng cùng một giao diện, nó được gọi là “đa hình”
// interfaceinterface class DataInterface {Triển khai Tóm tắt và giao diện
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
Nếu chúng ta cố gắng khởi tạo lớp
// interfaceinterface class DataInterface {8 như một đối tượng độc lập
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
Vì vậy, chúng ta không thể tạo các đối tượng từ các lớp trừu tượng. Thay vào đó, chúng ta cần tạo các lớp con thêm mã vào phần thân của các phương thức và sử dụng các lớp con này để tạo các đối tượng
$cDataAccess = new Data_Access;
Nó sẽ ném lỗi sau
PHP Fatal error: Uncaught Error: Cannot instantiate abstract class Data_Access ...// Concrete class extend abstract and implement interfacesclass Customers extend DataAccess implements DataInterface,DataFilterInterface {public function __construct[]{
$this->db_connect[];}// inherited interface class
public function insertData[$varDataRecord]{
}// inherited interface class
public function deleteData[$varRecordId]{
}// inherited interface class
public function getList[$varFilter]{
}}
Bởi vì giao diện thực thi quy tắc triển khai của nó, nếu tôi cố gắng loại bỏ một trong các chức năng trong
// interfaceinterface class DataInterface {0, ví dụ như
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
// interfaceinterface class DataInterface {1 và cố gắng khởi tạo nó, chúng tôi sẽ nhận được một lỗi nghiêm trọng
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
PHP Fatal error: Class Customers contains 1 abstract method and must therefore be declared abstract or implement the remaining methods [Data_Interface::insertRecord]
Sự khác biệt giữa Tóm tắt và giao diệnCác lớp và giao diện trừu tượng của PHP tương tự như trong các ngôn ngữ oops khác
sự khác biệt chính trong quan điểm lập trình là
- Trong các lớp trừu tượng, điều này không nhất thiết là mọi phương thức phải trừu tượng. Nhưng trong giao diện, mọi phương thức đều trừu tượng
- Phương thức của giao diện php chỉ phải ở chế độ công khai, không thể có công cụ sửa đổi quyền truy cập theo mặc định, mọi thứ được coi là công khai. Phương thức trong lớp trừu tượng trong php có thể là công khai hoặc được bảo vệ cả hai
- Giao diện hỗ trợ đa kế thừa nhưng lớp trừu tượng không hỗ trợ đa kế thừa
Điều đó có nghĩa là bạn có thể mở rộng một
// interfaceinterface class DataInterface {2 với một hoặc nhiều giao diện [do đó có nhiều kế thừa] như
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
Có thể thấy, chúng ta đang mở rộng
// interfaceinterface class DataInterface {3 với ba giao diện khác là
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
// interfaceinterface class DataInterface {4,
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
// interfaceinterface class DataInterface {4 và
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
// interfaceinterface class DataInterface {6
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
Bây giờ chúng ta hãy thử mở rộng một
// interfaceinterface class DataInterface {7
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
// interfaceinterface class DataInterface {4
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
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
// interfaceinterface class DataInterface {5
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
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
// interfaceinterface class DataInterface {8
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
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]
// interfaceinterface class DataInterface {9
public function insertData[$varDataRecord];
public function deleteData[$varRecordId];}interface class DataFilterInterface {
public function getList[$varFilter];}
4. Một giao diện chỉ chứa thành viên không đầy đủ nhưng trừu tượng không đầy đủ [trừu tượng] và thành viên hoàn chỉnh cũng vậy