Hướng dẫn dùng inheritamce trong PHP

Visibility là một phần rất quan trong của OOP. Nó cho phép bạn kiểm soát thành viên nào có thể truy cập vào class, để ngăn chặn sự sửa đồi variable từ bên ngoài chẳng hạn. Bình thường thì visibility được đặt là Public, có nghĩa là thành viên nào cũng có thể truy cập vào class. Điều này có nghĩa, bạn không nhất định phải chỉnh visibility, nếu không có access modifier thì theo default visibility sẽ là public.

Visibility trong PHP khá đơn giản vì chỉ có 3 loại khác nhau:

  • Private member: chỉ có thể được truy cập từ bên trong class.
  • Protected member: chỉ có thể được truy cập từ bên trong class và class con.
  • Public member: có thể được truy cập từ bất cứ nơi nào – bên ngoài class, bên trong class và class con.

Inheritance

Inheritance là một chức năng rất quan trong của OOP. Nó cho phép class thừa hưởng member của class khác.

Ví dụ bạn cần tạo ra class cho các loại động vật. Bạn có thể tạo class cho mè, chó vân vân, nhưng bạn sẽ nhận ra rằng các class này có một số function giống nhau, và một số function đặc biệt cho laoij động vật đó. Inheritance sé giúp bạn trong tình huống này. Bạn tạo ra một base class – Động vât (Animal) sau đó tạo class con cho các loài động vật bạn cần. Bạn hãy xem ví dụ sau:

class Animal
{
    public$name;
    
    publicfunction Greet()
    {
        return"Hello, I'm some sort of animal and my name is ".$this->name;
    }
}

Rất đơn giản, nhưng “Some sort of animal” (một loại động vật nào đó) thì chưa đủ, chúng ta sẽ tạo class con cho loài chó:

class Dog extends Animal
{
    
}

Loài chó được tạo ra như bình thường, nhưng chúng ta cần từ khóa để PHP hiểu là class loài cho cần inherit từ class Animal. Bây giờ, class loài chó sẽ có function như của class Animal:

$dog=new Dog();
echo$dog->Greet();

Bạn sẽ thấy là chúng ta có function Greet(), nhưng vẫn hơi chung chung, nên chũng ta sẽ viết thêm thông tin vào phần này:

class Dog extends Animal
{
    publicfunction Greet()
    {
        return"Hello, I'm a dog and my name is ".$this->name;
    }
}

Như các bạn thấy, chúng tôi đã gọi lại function Greet(), vì chúng tôi cần làm vậy cho  một thứ khác, nhưng class variable $name thì khhoong được gọi lại, vì chúng ta đã làm vậy ở class Animal. Chúng ta không cần $name, nhưng Greet() trong class Dog vẫn sẽ làm việc bình thường. Bây giờ chúng ta sẽ thử code:

$animal=new Animal();
echo$animal->Greet();
$animal=new Dog();
$animal->name ="Bob";
echo$animal->Greet();

Bạn có thể tiếp tục dùng Inheritance cho class con của class Dog, class chó con chảng hạn. Như vậy class chó con sẽ có variable và method của cả class Dog và class Animal.

Abstract class

Abstract class rất đặc biệt vì bạn không tự khởi tạo chúng được. Thay vào đó, bạn thừa hưởng function từ abstract class sang một class mới. Vì vậy, chúng ta hay dùng chúng làm base class cho một hệ thông class con khác. Trong phần trước chúng ta đã tạo class Animal và class con Dog. Trong dự án của bạn, bạn sẽ không khởi tạo class Animal, mà sẽ tạo class con cụ thể hơn. Class Animal sẽ trở thành base class cho bộ sưu tầm động vật của chúng ta.

Method cũng có thể được gọi là abstract. Khi bạn goi class function là abstract, bạn phải gọi class là abstract, abstract function chỉ có thể ở trong abstract class.  Một vấn đề khác là bạn không được viết code cho function, chỉ có thể gọi nó ra. Bạn làm vậy để bắt buộc bất kỳ ai thừa hưởng từ abstract class của bạn phải dùng function này và viết code đngs. Nếu không, PHP sẽ báo lỗi. Nhưng abstract classes cũng có thể có không abstract method, cho phép bạn dùng một số function đơn giản trong abstract class. Ví dù dưới đây là một abstract class:

abstractclass Animal
{
    public$name;
    public$age;
    
    publicfunction Describe()
    {
        return$this->name .", ".$this->age ." years old";    
    }
    
    abstractpublicfunction Greet();
} 

Sự khác biệt đầu tiên là từ khóa abstract, được đặt ở class và function cuối cùng của class. Như đã được đề cập, abstract function không được phép có code, vì vậy nó kết thúc với giấu chấm phẩy. Bây giờ chúng ta sẽ tạo cas con cho class Animal:

class Dog extends Animal
{
    publicfunction Greet()
    {
        return"Woof!";    
    }
    
    publicfunction Describe()
    {
        return parent::Describe() .", and I'm a dog!";    
    }
}

Như bạn thấy, chúng tôi dùng cả hai function từ class Animal. Chúng tôi bắt buộc phải dùng function Greet() vì nó là abstract. Chúng ta không nhất định phải dùng function Describe()-vì function này đã được dùng ở class Animal, nhưng chúng tôi muốn mở rộng nó thêm một chút. Điều thú vị ở đây là chúng ta có thể sử dụng lại code trong class Animal. Ví dụ ở đây là dùng từ khóa ‘parent’ để nối đến class Animal và gọi function Describe(). Chúng ta viết thêm nội dung để nói rõ về loài động vật chúng ta đang tạo. Bậy giờ ta thử dùng class mới này:

$animal=new Dog();
$animal->name ="Bob";
$animal->age =7;
echo$animal->Describe();
echo$animal->Greet();

Không có gì là quá đặc biệt. Chúng ta đã tạo class Dog, tạo hai property và gọi thêm hai method. Khi bạn thử code này, bạn sẽ thấy dòng Describe() là sự kết hợp của cả phiên bản Animal và Dog.