PHP - Kế Thừa: Hướng Dẫn Dành Cho Người Mới Bắt Đầu
Xin chào các pháp sư PHP tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình đầy thú vị vào thế giới của kế thừa trong PHP. Đừng lo lắng nếu bạn là người mới bắt đầu lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, giải thích mọi thứ từng bước một. Vậy, hãy lấy một cốc cà phê (hoặc trà, nếu đó là sở thích của bạn), và chúng ta cùng bắt đầu!
Kế Thừa Là Gì?
Kế thừa giống như một cây gia đình cho các lớp trong PHP. Cũng như bạn có thể kế thừa đôi mắt của bà nội hoặc cảm xúc hài hước của cha bạn, trong lập trình, một lớp có thể kế thừa các thuộc tính và phương thức từ một lớp khác. Khái niệm này giúp chúng ta viết mã tổ chức hơn và có thể tái sử dụng.
Hãy tưởng tượng như bạn đang tạo một trò chơi video với các loại nhân vật khác nhau. Tất cả các nhân vật có thể chia sẻ một số đặc điểm cơ bản (như có tên hoặc điểm máu), nhưng mỗi loại nhân vật (như chiến binh hoặc pháp sư) có thể có các khả năng đặc biệt. Kế thừa cho phép chúng ta xác định các đặc điểm chung trong một lớp cơ bản và sau đó tạo các lớp nhân vật cụ thể kế thừa các đặc điểm này và thêm các tính năng độc đáo của riêng chúng.
Ví Dụ Kế Thừa Cơ Bản
Hãy bắt đầu với một ví dụ đơn giản để xem cách kế thừa hoạt động trong PHP.
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
echo "The animal makes a sound.";
}
}
class Dog extends Animal {
public function speak() {
echo $this->name . " barks: Woof woof!";
}
}
$myDog = new Dog("Buddy");
$myDog->speak(); // Output: Buddy barks: Woof woof!
Trong ví dụ này, chúng ta có hai lớp: Animal
và Dog
. Lớp Dog
kế thừa lớp Animal
, có nghĩa là nó kế thừa tất cả các thuộc tính và phương thức của Animal
.
Hãy phân tích nó:
- Chúng ta xác định một lớp cơ bản
Animal
với một thuộc tính$name
và một phương thứcspeak()
. - Chúng ta tạo một lớp
Dog
kế thừaAnimal
bằng từ khóaextends
. - Lớp
Dog
ghi đè phương thứcspeak()
với việc triển khai riêng của nó. - Chúng ta tạo một đối tượng
Dog
tên là "Buddy" và gọi phương thứcspeak()
của nó.
Lớp Dog
kế thừa thuộc tính $name
từ Animal
, nhưng cung cấp phiên bản riêng của phương thức speak()
. Điều này được gọi là ghi đè phương thức, và nó là một tính năng mạnh mẽ của kế thừa.
Kế Thừa và các Modifier Truy cập
Bây giờ, hãy nói về cách kế thừa hoạt động với các modifier truy cập khác nhau (public, protected, và private).
class Vehicle {
public $brand;
protected $model;
private $serialNumber;
public function __construct($brand, $model, $serialNumber) {
$this->brand = $brand;
$this->model = $model;
$this->serialNumber = $serialNumber;
}
public function getInfo() {
return "Brand: " . $this->brand . ", Model: " . $this->model;
}
protected function getSerialNumber() {
return $this->serialNumber;
}
}
class Car extends Vehicle {
public $doors;
public function __construct($brand, $model, $serialNumber, $doors) {
parent::__construct($brand, $model, $serialNumber);
$this->doors = $doors;
}
public function getFullInfo() {
return $this->getInfo() . ", Doors: " . $this->doors . ", SN: " . $this->getSerialNumber();
}
}
$myCar = new Car("Toyota", "Corolla", "ABC123", 4);
echo $myCar->getFullInfo();
// Output: Brand: Toyota, Model: Corolla, Doors: 4, SN: ABC123
Trong ví dụ này:
- Lớp
Vehicle
có các thuộc tính với các modifier truy cập khác nhau. - Lớp
Car
kế thừaVehicle
và thêm thuộc tính riêng của nó ($doors
). - Lớp
Car
có thể truy cập các thành viên public và protected củaVehicle
, nhưng không thể truy cập các thành viên private. - Chúng ta sử dụng
parent::__construct()
để gọi constructor của lớp cha.
Lưu ý:
- Các thành viên public có thể truy cập từ bất kỳ đâu.
- Các thành viên protected có thể truy cập trong lớp và các lớp con.
- Các thành viên private chỉ có thể truy cập trong lớp được định nghĩa.
Constructor trong Kế Thừa
Hãy cùng tìm hiểu sâu hơn về cách constructor hoạt động trong kế thừa:
class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
echo "Shape constructor called.<br>";
}
}
class Circle extends Shape {
private $radius;
public function __construct($color, $radius) {
parent::__construct($color);
$this->radius = $radius;
echo "Circle constructor called.<br>";
}
public function getInfo() {
return "A {$this->color} circle with radius {$this->radius}";
}
}
$myCircle = new Circle("red", 5);
echo $myCircle->getInfo();
Output:
Shape constructor called.
Circle constructor called.
A red circle with radius 5
Đây là những gì đang xảy ra:
- Khi chúng ta tạo một đối tượng
Circle
, PHP đầu tiên gọi constructor củaShape
(lớp cha). - Sau đó, nó gọi constructor của
Circle
. - Chúng ta sử dụng
parent::__construct($color)
để đảm bảo constructor củaShape
được gọi và thuộc tính$color
được đặt. - Cuối cùng, chúng ta đặt thuộc tính
$radius
đặc trưng cho lớpCircle
.
Điều này đảm bảo rằng cả lớp cha và lớp con đều được khởi tạo đúng cách.
Bảng Tham Chiếu Phương Thức
Dưới đây là bảng tham chiếu các phương thức chúng ta đã sử dụng trong các ví dụ:
Phương Thức | Mô Tả |
---|---|
__construct() |
Phương thức constructor, được gọi khi một đối tượng được tạo ra |
speak() |
Phương thức để làm cho một con vật nói |
getInfo() |
Phương thức để lấy thông tin cơ bản về một phương tiện |
getSerialNumber() |
Phương thức protected để lấy số serial của một phương tiện |
getFullInfo() |
Phương thức để lấy thông tin đầy đủ về một chiếc xe |
Kết Luận
Kế thừa là một công cụ mạnh mẽ trong PHP cho phép chúng ta tạo ra các hierarchies của các lớp, thúc đẩy việc tái sử dụng và tổ chức mã. Nhớ rằng, nó giống như xây dựng với các mảnh LEGO - bạn bắt đầu với một mảnh cơ bản và tiếp tục thêm các mảnh cụ thể lên trên.
Khi bạn tiếp tục hành trình học PHP, bạn sẽ tìm thấy nhiều cách thú vị khác để sử dụng kế thừa. Hãy tiếp tục thực hành, và sớm bạn sẽ tạo ra các chương trình hướng đối tượng phức tạp và hiệu quả một cách dễ dàng!
Chúc mừng coding, các nhà vô địch PHP tương lai! ?????
Credits: Image by storyset