[Bài đọc] Kế thừa & ghi đè phương thức – Học PHP

Lập trình hướng đối tượng cho người mới bắt đầu với php

Để hiểu được phần hướng dẫn này bạn nên có hiểu biến căn bản về hàm, biến, cấu trúc điều kiện và vòng lặp. Bài hướng dẫn về lập trình hướng đối tượng với php được trình bày từ bước 18 đến 22. 

Bước 18: Thừa kế – sử dụng lại mã lệnh

Thừa kế là một trong những đặc tính quan trọng trong OOP, nơi mà bạn có thể sử dụng một lớp như là lớp cơ sở cho một hoặc nhiều lớp khác.

Tại sao cần làm điều đó?

Điều này cho phép bạn sử dụng lại hiệu quả mã đã có trong lớp cơ sở.

Bạn muốn tạo ra một lớp mới là Employee. Chúng ta có thể hiểu rằng Employee là một kiểu của lớp Person, lớp Person chia sẻ một số thuộc tính và phương thức.

Trong trường hợp này, việc thừa kế có thể làm cho mã của bạn nhẹ hơn … bởi vì bạn đang sử dụng cùng một mã trong hai lớp khác nhau.

Hãy xem đoạn mã sau:

// 'extends' là từ khóa sử dụng trong khai báo kế thừa.
class Employee extends Person
{
     function __construct($Employee_name) {
            $this->set_name($Employee_name);
     }
}

Bước 19: Sử dụng lại mã với thừa kế – phần 2

Lớp Employee được tạo dựa trên lớp Person, do đó lớp Employee sẽ được sử dụng tất cả các thuộc tính và phương thức được khai báo là public và protected của lớp Person.

Lưu ý: Có thể hiểu Employee là một kiểu của Person.

Mã lệnh:

class Employee extends Person
{
    function __construct($Employee_name){
         $this->set_name($Employee_name);
    }
}

Hãy quan sát cách chúng ta sử dụng phương thức set_name() trong lớp Employee, mặc dù chúng ta không khai báo phương thức đó trong lớp Employee. Đó là bởi vì chúng ta đã tạo ra set_name() trong lớp Person.

Lưu ý: Lớp Person được gọi là lớp cơ sở hoặc lớp cha vì đó là lớp mà lớp Employee được tạo dựa trên nó. Sự phân cấp này sẽ trở nên quan trọng khi ứng dụng của bạn trở nên phức tạp hơn.

Bước 20: Sử dụng lại mã với thừa kế – phần 3

Như bạn có thể thấy trong đoạn mã dưới đây, chúng ta có thể gọi phương thức get_name qua đối tượng $james của lớp Employee.

Mã lệnh:

<?php      include("class_lib.php");
     // sử dụng đối tượng trong trang php.
     $stefan = new Person("Stefan Mischook");
     echo "Stefan's full name: " . $stefan->get_name();

     $james = new Employee("Johnny Fingers");
     echo "---> " . $james->get_name();
?>

Đây là một ví dụ điển hình về cách OOP có thể giảm số lượng các dòng lệnh (tức không phải viết lại phương thức get_name() trong lớp Employee) và dễ dàng hơn nhiều cho việc bảo trì mã lệnh.

Bước 21: Ghi đè phương thức (overriding methods)

Trong thừa kế, đôi khi bạn cần phải thay đổi cách một phương thức hoạt động từ lớp cơ sở.

Ví dụ, giả sử phương thức set_name() trong lớp Employee, phải làm một điều gì đó khác với những gì nó làm trong lớp Person.

Chúng ta cần ‘ghi đè’ phương thức set_name() của lớp bằng cách khai báo phương thức đó ngay trong chính lớp Employee.

Mã lệnh:

<?php
class Person{    protected $name;
    protected function set_name($new_name) {
        if ($new_name != "Jimmy Two Guns") {
            $this->name = strtoupper($new_name);
        }
    }
}

class Employee extends Person{    
     protected function set_name($new_name) {                                               
       if ($new_name == "Stefan Sucks"){ 
          $this->name = $new_name;                                               
       }                                
     }                
} ?>

Lưu ý: Cách hoạt động của phương thức set_name() trong lớp Employee khác với cách hoạt động của phương thức set_name() trong lớp Person.

Bước 22: Ghi đè phương thức – phần 2 

Khi bạn cần truy cập vào phương thức của lớp cha từ phương thức của lớp con, sử dụng ký hiệu ::

Trong ví dụ trước, chúng ta đã cài đặt lại phương thức set_name() trong lớp Employee. Chúng ta sử dụng mã lệnh sau để truy cập vào phương thức set_name() của lớp cha từ lớp con

Person::set_name($new_name);

Mã lệnh:

<?php
class Person{
     // thuộc tính của lớp là một tùy chọn có thể không cần khai báo 
     // – tuy nhiên nếu khai báo tường minh thì điều đó rất tốt
     var $name;           
     function __construct($Persons_name) {
         $this->name = $Persons_name;
     }

     public function get_name() {
         return $this->name;                                 
     }     
             
     // các phương thức và thuộc tính khi được khai báo là protected và protected                               
     // nhằm hạn chế truy xuất                                 
     protected function set_name($new_name) {                                                
         if ($this->name !=  "Jimmy Two Guns") 
         {                                                              
            $this->name = strtoupper($new_name);                                             
         }                                
     }                
}        
        
// từ khóa extends được sử dụng khi khai báo kế thừa
class Employee extends Person                
{                                
      protected function set_name($new_name) {                                
          if ($new_name ==  "Stefan Sucks") {                                               
             $this->name = $new_name;                                
          }                               
          else if ($new_name ==  "Johnny Fingers") {              
             Person::set_name($new_name);                                
          }                
      }  
              
      function __construct($Employee_name)                
      {                                
           $this->set_name($Employee_name);                
      } 
} ?>

Lưu ý: Sử dụng ký hiệu :: cho phép bạn truy cập vào phương thức của một lớp.

Person::set_name()

Cho phép truy cập vào phương thức set_name() của lớp Person.

Một cách khác cho việc truy xuất các phương thức của lớp cha từ lớp con sử dụng khi sử dụng từ khóa parent.

Mã lệnh:

protected function set_name($new_name)
{           
     if ($new_name ==  "Stefan Sucks") {
          $this->name = $new_name; 
     }           
     else if ($new_name ==  "Johnny Fingers") {
          parent::set_name($new_name);           
     }            
} 

Kết luận

Trong phần này chỉ đề cập đến các vấn đề cơ bản của OOP trong PHP. Hãy nhớ rằng cách tốt nhất để hiểu rõ về vấn đề là cần viết code.

Hãy tạo ra 10 đối tượng đợn giản từ các lớp đã xây dựng ở trên, sau đó sử dụng các đối tượng này để thao tác với các thuộc tính và phương thức, bạn cần nhìn thấy kết quả trên trang php.

Share this: