KẾ THỪA NHIỀU LỚP TRONG PHP

Loạt bài viết về Lập trình hướng đối tượng trong PHP gồm 4 phần, hiện tại bạn đang ở trong phần 2.

Bạn đang xem: Kế thừa nhiều lớp trong php

Phần 2: Tính kế thừa.

1. Mở đầu

Trong phần một chúng ta đã được làm quen với các thuật ngữ cơ bản như class, object, tính mô đun hóa và tính trìu tượng trong OOP. Trong bài viết tiếp theo này, bạn sẽ cùng chúng tôi khám phá những vấn đề cốt lõi của OOP là tính kế thừa, tính đóng gói, cách ghi đè phương thức trong kế thừa và cuối cùng là phạm vi truy cập các thành phần trong lớp. Sự thừa kế trong class là một class có nguồn gốc từ một class khác, cũng giống như con người, con cái được thừa hưởng những phẩm chất từ cha mẹ. Trong thế giới hướng đối tượng, các phẩm chất này là các thuộc tính và phương thức. Thông qua kế thừa, một class được “sinh ra” với cùng thuộc tính và phương thức của class mà nó kế thừa, lớp kế thừa thậm chí còn có những phẩm chất riêng mà cha mẹ không có.


*

Trong trường hợp này, lớp ChildrenClass kế thừa ParentClass mà không có những phẩm chất riêng nào. Trong sơ đồ UML tiếp theo, các class con là ChildrenClass1 và ChildrenClass2 đã kế thừa và phát huy, nó đã có những "phẩm chất" riêng.

*

Sự kế thừa có thể diễn ra nhiều "đời" trong lập trình hướng đối tượng, không giới hạn số lần kế thừa. Chúng ta cùng xem sơ đồ UML tiếp theo, lớp ChildrenClass kế thừa từ ParentClass, lớp GrandChildClass lại kế thừa từ ChildrenClass.

*

Khi bạn định nghĩa một class bằng cách kế thừa một class khác, sẽ không mất thời gian để thiết kế lại class. Bạn có thể thêm các thuộc tính và phương thức mới, tuy nhiên chúng ta có thể thay đổi hành vi các phương thức được kế thừa từ lớp cha? Nếu thay đổi định nghĩa lớp cha sẽ dẫn đến các lớp kế thừa khác bị ảnh hưởng. Thay vào đó, chúng ta có thể ghi đè phương thức được kế thừa từ lớp cha trong lớp con. Đây chính là tính đa hình trong OOP, nơi mà gọi cùng một phương thức sẽ cho các kết quả khác nhau phụ thuộc vào loại đối tượng. Các thành phần class có thể truy nhập và thay đổi một class khác, điều này đôi khi không tốt và trong lập trình hướng đối tượng khái niệm phạm vi truy cập (visibility) xuất hiện, nó có đưa ra các phạm vi thay đổi các thành phần của class.

2. Sự kế thừa class

Một trong những cách để lập trình nhanh là khả năng sử dụng lại các định nghĩa class, quá trình này chính là kế thừa. Trở lại với ví dụ về class User, class này có các thuộc tính username, userId, email, password và có các phương thức là login, logout. Bạn có thể tạo ra một class khác là Admin, nó được mở rộng từ User. Một đối tượng Admin có thể có thêm thuộc tính accessLevel và phương thức editUser.

*

Như vậy giữa hai class có một mối quan hệ “is a”, Admin là một dạng của User. Để tạo một class con từ class cha, sử dụng từ khóa extends. Nếu bạn đã định nghĩa lớp ClassName ở bài trước, bạn có thể tạo một lớp con như sau:

class ChildClass extends ClassName { } Class ChildClass sẽ sở hữu các thành phần của lớp cha ClassName, bạn có thể thay đổi ChildClass để đáp ứng các yêu cầu riêng mà không thay đổi gì lớp cha ClassName. Chú ý: Để kiểm tra xem một đối tượng có phải là một thực thể của class nào đó không sử dụng từ khóa instanceof

if ($obj instanceof "ClassName") { // $obj là một thực thể của lớp ClassName} Chúng ta cùng thực hành lý thuyết trên với một ví dụ cụ thể, tạo file inheritance.php trong thư mục C:/xampp/htdocs/OOP (Xem phần 1 để cài đặt môi trường thực hành cho loạt bài Lập trình hướng đối tượng trong PHP).

Ví dụ về kế thừa trong lập trình hướng đối tượng name = $pet_name; } // Vật nuôi có thể ăn function eat() { echo "$this->name đang ăn.

Xem thêm: việc làm php hcm

"; } // Vật nuôi có thể ngủ function sleep() { echo "

$this->name đang ngủ.

"; } } // End of Pet class. /* Class Mèo kế thừa class Vật nuôi * Mèo có thêm phương thức: climb(). */ class Cat extends Pet { // Mèo có thể trèo tường function climb() { echo "

$this->name đang trèo tường.

"; } } // End of Cat class. /* Class chó kế thừa class Vật nuôi * Chó có thêm phương thức: fetch(). */ class Dog extends Pet { // Chó có thể lấy đồ vật về. function fetch() { echo "

$this->name đang lấy đồ vật cho chủ.

"; } } // End of Dog class. #------------ KẾT THÚC ĐỊNH NGHĨA CLASS ----------------------# // Tạo một con chó tên Jonh $dog = new Dog("Jonh"); // Tạo một con mèo tên Mina $cat = new Cat("Mina"); // Cho hai con này ăn $dog->eat(); $cat->eat(); // Cho hai con vật này ngủ $dog->sleep(); $cat->sleep(); // Chó thì bắt lấy đồ vật còn mèo bắt trèo tường $dog->fetch(); $cat->climb(); // Xóa đối tượng khi không dùng đến unset($dog, $cat); ?>