Bài 07: Kế thừa lồng trong ph - Học lập trình PHP nâng cao
Trong bài này chúng ta tìm hiểu kế thừa lồng trong PHP và nguyên tắc hoạt động của ba mực độ truy cập private, protected và public. Trước tiên chúng ta tìm hiểu khái niệm kế thừa lồng là gì đã nhé. 1. Kế thừa lồng là gì? Kế thừa lồng hay còn gọi là kế thừa nhiều lớp, nghĩa là một ...
Trong bài này chúng ta tìm hiểu kế thừa lồng trong PHP và nguyên tắc hoạt động của ba mực độ truy cập private, protected và public. Trước tiên chúng ta tìm hiểu khái niệm kế thừa lồng là gì đã nhé.
1. Kế thừa lồng là gì?
Kế thừa lồng hay còn gọi là kế thừa nhiều lớp, nghĩa là một lớp được kế thừa từ nhiều lớp. Lớp B kế thừa lớp A, lớp C kế thừa lớp B và thế là ta có luồng kế thừa A -> B -> C. Một ví dụ khác thực tế hơn, giả sử Ông mình sinh ra Ba mình, Ba mình sinh ra mình như vậy mình kế thừa dòng máu của Ông mình và Ba mình.
Ví dụ:
class A { } class B extends A { } class C extends B { }
Nhìn ví dụ thật đơn giản phải không nào, nhưng đi sâu vào bên trong nó không đơn giản tí nào đâu. Vấn đề đặt ra là khi kế thừa nhiều cấp như vậy thì các biến (thuộc tính), các hàm (phương thức) ở các lớp cha được sử dụng ở lớp con như thế nào ? Để hiểu rõ hơn vấn đề này ta sẽ đi qua phần hai.
2. Các mức độ truy cập trong kế thừa lồng
Như ta đã biết có 3 mức độ truy cập hay dùng nhất đó là private, public và protected. Cũng như trong kế thừa một cấp, tất cả những biến (thuộc tính) và hàm (phương thức) ở dạng public thì ở tất cả các lớp con dù ở cấp độ nào nó cũng có thể truy xuất vào được. Nếu ở dạng private thì chỉ dùng trong lớp đó. Nếu ở dạng protected thì tất cả các lớp kế thừa nó dù là lồng bao nhiêu lần thì cũng có thể sử dụng. Định nghĩa này chúng ta đã được học ở bài trước và cũng được giữ nguyên cho bài kế thừa lồng này.
Ví dụ:
// Lớp A class A { protected $protected_A = 'Protected'; private $private_A = 'Private'; public $public_A = 'Public'; private function showPrivate() { echo $this->private_A; } protected function showProtected() { echo $this->protected_A; } public function showPublic() { echo $this->public_A; } } // Lớp B Kế Thừa Lớp A class B extends A { public function ClassB() { echo $this->protected_A; } } // Lớp C Kế Thừa Lớp B class C extends B { public function showInfo() { // Lệnh này đúng vì nó truy xuất vào thuộc tính protected $this->protected_A = 'Nguyễn Văn A'; // Lệnh này đúng vì nó truy xuất vào thuộc tính public $this->public_A = 'Nguyễn Văn B'; // Lệnh này sai vì nó truy xuất vào thuộc tính private $this->private_A = 'Lệnh sai'; } } // ------------------// // Chương trình chính// // ------------------// // Khởi tạo lớp C // Lớp C được kế thừa từ lớp B // mà lớp B kế thừa từ lớp A nên // suy ra nó kế thừa từ 2 lớp A, B $c = new C(); // Lệnh này đúng vì gọi đến hàm public của lớp cha A $c->showPublic(); // Lệnh này sai vì nó gọi hàm protected của lớp cha A $c->showProtected(); // Lệnh này sai vì nó gọi hàm private của lớp cha A $c->showPrivate(); // Lệnh này đúng vì nó truy xuất vào hàm public của lớp cha B $c->ClassB();
Qua các phần ghi chú trong ví dụ tôi đã giải thích cho các bạn rồi. Như vậy là các bạn thấy nó cũng không có gì đặc biệt đúng không nào.
3. Lời kết
Qua bài học này các bạn đã hiểu được kế thừa lồng thực bản chất nó cũng là kế thừa nên có thể áp dụng các tính chất của kế thừa để áp đặt vào nó. Bài tiếp theo chúng ta sẽ tìm hiểu khi nào sử dụng private protected và public