Tính kế thừa (inheritance) trong PHP

Đây là bài 33/39 bài của series môn học Lập trình Web PHP

Trong bài này, chúng ta sẽ tìm hiểu về tính kế thừa (inheritance) trong PHP. Để học tốt bài này, các bạn cần đọc lại bài Cài đặt môi trường lập trình Web PHP với XAMPP để biết cách chạy ứng dụng web PHP với XAMPP.

1. Kế thừa (inheritance) trong PHP là gì?

Tính kế thừa (inheritance) đề cập đến việc định nghĩa một lớp mới (new class) dựa trên một lớp cũ đã có (existing class). Lớp mới được gọi là lớp dẫn xuất (derived class) hay lớp con (child class). Lớp cũ đã có gọi là lớp cơ sở (base class) hoặc lớp cha (parent class).

Lớp con sẽ kế thừa tất cả các thuộc tính và phương thức publicprotected từ lớp cha. Ngoài ra, lớp con có thể có các thuộc tính và phương thức riêng.

Trong PHP, một lớp con kế thừa lớp cha bằng cách sử dụng từ khóa extends. Ví dụ:

<?php
class Cat {
    public $name;
    public $color;
    public function __construct($name, $color) {
        $this->name = $name;
        $this->color = $color;
    }
    public function info() {
        echo "The cat is {$this->name} and the color is {$this->color}.";
    }
}
class Kitty extends Cat {
    public function message() {
        echo "Hello, my name is " . $this->name . ", has " . $this->color . " color";
    }
  }
$kitty = new Kitty("Kitty", "pink and white");
$kitty->message();
echo "<br>";
$kitty->info();
?>

Lớp Kitty kế thừa từ lớp Cat. Lớp Kitty có thể sử dụng các thuộc tính public $name$color cũng như các phương thức public __construct()info() kế thừa từ lớp Cat. Lớp Kitty cũng có phương thức của riêng nó là message().

2. Chỉ định truy cập protected trong kế thừa

Những thuộc tính và phương thức có chỉ định truy cập là protected thì chỉ được truy cập bên trong lớp (class) chứa nólớp dẫn xuất (derived class) của lớp đó.

<?php
class Cat {
    public $name;
    public $color;
    protected $weight;
    public function __construct($name, $color, $weight) {
        $this->name = $name;
        $this->color = $color;
        $this->weight = $weight;
    }
    protected function info() {
        echo "The cat is {$this->name} and the color is {$this->color}.";
    }
}
class Kitty extends Cat {
    public function message() {
        // using protected method
        $this->info();
        echo "<br>Hello, my name is " . $this->name . ", has " . $this->color . " color";
        // using protected $weight in derived class
        echo "<br> And my weight is " . $this->weight . " kilograms";
    }
  }
$kitty = new Kitty("Kitty", "pink and white", "3.5");
$kitty->message();
?>

Trong ví dụ trên, thuộc tính $weight có chỉ định truy cập là protected và có thể sử dụng trong lớp dẫn xuất. Phương thức info() có chỉ định truy cập là protected và có thể sử dụng trong lớp dẫn xuất.

3. Ghi đè (overriding) phương thức kế thừa trong PHP

Các phương thức mà lớp con kế thừa có thể được ghi đè (overriding) bằng cách định nghĩa lại các phương thức này trong lớp con.

<?php
class Cat {
    public $name;
    public $color;
    public function __construct($name, $color) {
        $this->name = $name;
        $this->color = $color;
    }
    public function info() {
        echo "The cat is {$this->name} and the color is {$this->color}.";
    }

}
class Kitty extends Cat {
    public $weight;
    public function __construct($name, $color, $weight) {
        $this->name = $name;
        $this->color = $color;
        $this->weight = $weight;
    }
    public function info() {
        echo "Hello, my name is " . $this->name . ", has " . $this->color . " color";
        // using protected $weight in derived class
        echo "<br> And my weight is " . $this->weight . " kilograms";
    }
  }
$kitty = new Kitty("Kitty", "pink and white", "3.5");
$kitty->info();
?>
Kết quả
Hello, my name is Kitty, has pink and white color
And my weight is 3.5 kilograms

Các phương thức __construct()info() trong lớp con Kitty sẽ ghi đè các phương thức __construct()info() trong lớp cha Cat.

4. Từ khóa final và kế thừa trong PHP

Từ khóa final có thể được sử dụng để ngăn kế thừa một lớp hoặc ngăn ghi đè (overriding) phương thức.

<?php
final class Cat {
    //code
}
// will result in error
class Kitty extends Cat {
    //code
}
?>

Trong ví dụ trên, lớp Cat được khai báo final nên không được kế thừa.

<?php
class Cat {
    final public function info() {
        // some code
    }
}
class Kitty extends Cat {
    // will result in error
  public function info() {
    // some code
  }
}
?>

Trong ví dụ trên, hàm info() trong lớp Cat được khai báo final nên không được ghi đè trong lớp con Kitty.

5/5 - (1 bình chọn)
Bài trước và bài sau trong môn học<< Các chỉ định truy cập (access modifier) trong PHPLớp trừu tượng (abstract class) và interface trong PHP >>
Chia sẻ trên mạng xã hội:

Tác giả Vinh Lê

Vinh Lê hiện đang là biên tập viên tại Góc Học IT.

Bài viết của Vinh Lê

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.