Bài 05: Hàm khỏi tạo trong OPP

PHP nâng cao 20/01/2017 02:15 1122
Như các bạn đã biết Constructor là một phương thức magic đặc biệt, được thực thi ngay khi tạo ra đối tượng. Nó thường được sử dụng để khởi tạo các chức năng như gán thuộc tính với giá trị hay tạo ra các đối tượng khác từ đối tượng vừa tạo.

Chúng ta sẽ tìm hiêu thêm hàm hủy trong OPP và bạn có thể hiểu một cách ngắn gọn:

  • Hàm khởi tạo: Hàm được tạo ra với mục đích tạo ra một đại diện(bộ mặt, ...) cho một lớp đối tượng bất kỳ. Từ nó ta có thể truy cập tới các thuộc tính, phương thức bên trong của lớp đối tượng đó.
  • Hàm hủy là hàm gọi sau khi đối tượng bất kỳ bị hủy

1. Hàm khởi tạo

Hàm khởi tạo luôn luôn được gọi tới khi ta khởi tạo một đối tượng. Hàm khởi tạo có thẻ có hoặc không có tham số, có thể có giá trị trả về hoặc không. Một hàm bình thường khác bạn cũng có thể gọi lại hàm khởi tạo được và ngược lại hàm khởi tạo cũng có thể gọi một hàm bình thường khác.

Có hai cách khai báo tên hàm khởi tạo. Cách thứ nhất là khai báo tên trùng với tên lớp:

class SinhVien{
    function SinhVien() {
       // Lênh
    }
}
// Khởi tạo lớp SinhVien
$sv= new SinhVien();

Cách thứ hai là khai báo phương thức magic __construct

class SinhVien{
    function __construct() {
       // Lệnh
    }
}
// Khởi tạo lớp SinhVien
$sv = new SinhVien();

Kết quả của cả hai đoạn code trên sẽ xuất ra màn hình dòng chữ “Lớp sinh viên được khởi tạo” vì khi khởi tạo đối tượng SinhVien thì hàm khởi tạo __construct() và SinhVien() sẽ  được tự động gọi.

Hàm khởi tạo cũng có thể có các tham số truyền vào, lúc này khi khởi tạo đối tượng thì ta sẽ truyền các tham số đó vào trong lớp.

class SinhVien{
    function __construct($name) {
        echo $name;
    }
}
// Khởi tạo lớp SinhVien
$sv = new SinhVien('Bùi Văn Thiêm');

2. Hàm khởi tạo trong kế thừa

Khi lớp con kế thừa từ lớp bất kỳ(lớp cha) thì khi ta tạo một đối tượng thuộc lớp con thì sẽ xảy ra một trong các trường hợp sau đây.

Trường hợp 1: Nếu lớp Con có hàm khởi tạo và lớp cha cũng có hàm khởi tạo

Trường hợp này hàm khởi tạo của lớp con sẽ được chạy, còn hàm khởi tạo ở lớp cha không được chạy.

Ví dụ:

// Tạo một class động vật
class Animal {
    function __construct() {
        echo 'Lớp Animal được khởi tạo';
    }
}
class Dog extends Animal {
    function __construct() {
        echo 'Lớp Dog được khởi tạo';
    }
}
$dog = new Dog(); 
// Kết quả là:
Lớp Dog được khởi tạo

Trường hợp 2: Nếu lớp con không có hàm khởi tạo, lớp Cha có hàm khởi tạo

Trường hợp này hàm khởi tạo ở lớp cha sẽ được chạy.

Ví dụ:

class Animal {
    function __construct() {
        echo 'Lớp Animal được khởi tạo';
    }
}
class Dog extends Animal {
   // Khai báo thuộc tính
   private $name;
   
   // Phương thức
   public function setName($name){
       $this->name = $name;
   }
   public function getName(){
       echo $this->name;
   }
}
$dog = new Dog();
$dog->setName('Akita');
echo $dog->getName();
// Kết quả:
// Lớp Animal được khởi tạo
// Akita

Trường hợp 3: Lớp Con có hàm khởi tạo, lớp cha không có hàm khởi tạo

Trường hợp này hàm khởi tạo lớp con sẽ được chạy.

class Animal {
    function __construct() {
        echo 'Lớp Animal được khởi tạo';
    }
}
class Dog extends Animal {
   // Khai báo thuộc tính
   private $name;
   
   function __construct(){
      echo 'Lớp Dog được khởi tạo';
   }
}
$dog = new Dog();
// Kết quả:
// Lớp Dog được khởi tạo

Trường hợp 4: Cả 2 lớp chà và lớp con đều không có hàm khởi tạo

Trường hợp này đương nhiên là sẽ không có hàm nào được chạy

3. Hàm hủy

Hàm hủy là hàm tự động gọi sau khi đối tượng bị hủy, nó thường được sử dụng để giải phóng bộ nhớ chương trình. Trong đối tượng hàm hủy có thể có hoặc không.

class Animal {
    function __construct() {
        echo 'Lớp Animal được khởi tạo';
    }
    function __destruct() {
        echo 'Lớp Animal đã hủy';
    }
}
$animal = new Animal();
// Kết quả:
// Lớp Animal được khởi tạo
// Lớp Animal đã hủy

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.