Trong lập trình hướng đối tượng (OOP), constructor (phương thức khởi tạo) là một khái niệm rất quan trọng. Constructor là một phương thức đặc biệt được gọi tự động khi một đối tượng của một class được tạo ra. Nó thường được sử dụng để khởi tạo giá trị cho các thuộc tính của đối tượng hoặc để thực hiện bất kỳ thiết lập ban đầu nào cần thiết khi đối tượng bắt đầu tồn tại.

Bài viết này sẽ giúp bạn hiểu rõ hơn về constructor trong PHP và cách sử dụng nó một cách hiệu quả.

1. Constructor là gì?

Constructor là một phương thức đặc biệt với tên cố định là __construct(). Phương thức này sẽ được gọi tự động khi bạn sử dụng từ khóa new để tạo ra một đối tượng từ một class. Bên trong constructor, bạn có thể đặt giá trị ban đầu cho các thuộc tính của đối tượng hoặc thực hiện các thao tác thiết lập khác.

Cú pháp của Constructor

php
class ClassName {
    public function __construct() {
        // Các câu lệnh khởi tạo
    }
}

Khi một đối tượng được tạo từ class đó, PHP sẽ tự động gọi phương thức __construct() mà không cần bạn phải gọi nó thủ công.

2. Ví dụ về Constructor

Trong ví dụ dưới đây, chúng ta sẽ tạo một class Car có constructor để thiết lập giá trị cho thuộc tính color của đối tượng.

php
class Car {
    public $color;

    // Constructor
    public function __construct($color) {
        $this->color = $color;
    }

    public function getColor() {
        return $this->color;
    }
}

// Tạo một đối tượng từ class Car
$myCar = new Car("Red");

echo $myCar->getColor(); // Output: Red

Giải thích:

  • Khi bạn tạo đối tượng $myCar với từ khóa new Car("Red"), PHP sẽ tự động gọi phương thức __construct() với tham số "Red".
  • Constructor sẽ gán giá trị "Red" cho thuộc tính $color của đối tượng $myCar.
  • Sau đó, khi gọi phương thức getColor(), bạn sẽ nhận được kết quả là "Red".

3. Constructor với nhiều tham số

Constructor có thể chấp nhận nhiều tham số để khởi tạo giá trị cho nhiều thuộc tính cùng một lúc. Hãy xem ví dụ sau với class Car có thêm thuộc tính brand (hãng xe):

php
class Car {
    public $color;
    public $brand;

    // Constructor với nhiều tham số
    public function __construct($color, $brand) {
        $this->color = $color;
        $this->brand = $brand;
    }

    public function getCarInfo() {
        return "This car is a " . $this->color . " " . $this->brand;
    }
}

// Tạo một đối tượng từ class Car
$myCar = new Car("Blue", "Toyota");

echo $myCar->getCarInfo(); // Output: This car is a Blue Toyota

Giải thích:

  • Constructor nhận hai tham số $color$brand để khởi tạo các thuộc tính tương ứng của đối tượng.
  • Khi tạo đối tượng $myCar với từ khóa new Car("Blue", "Toyota"), giá trị "Blue" được gán cho thuộc tính $color"Toyota" được gán cho thuộc tính $brand.
  • Phương thức getCarInfo() sau đó trả về thông tin đầy đủ của xe dựa trên các thuộc tính đã được khởi tạo.

4. Constructor mặc định

Nếu bạn không khai báo constructor cho một class, PHP sẽ tự động cung cấp một constructor mặc định. Constructor mặc định này không làm gì cả, nhưng nó vẫn sẽ được gọi khi một đối tượng được tạo.

Ví dụ:

php
class Car {
    public $color = "White";
}

$myCar = new Car();
echo $myCar->color; // Output: White

Trong ví dụ trên, PHP đã sử dụng constructor mặc định vì không có __construct() nào được khai báo trong class Car.

5. Constructor với giá trị mặc định cho tham số

Bạn có thể gán giá trị mặc định cho các tham số của constructor. Điều này cho phép bạn tạo đối tượng mà không cần truyền đủ tất cả các tham số.

php
class Car {
    public $color;
    public $brand;

    // Constructor với giá trị mặc định
    public function __construct($color = "White", $brand = "Unknown") {
        $this->color = $color;
        $this->brand = $brand;
    }

    public function getCarInfo() {
        return "This car is a " . $this->color . " " . $this->brand;
    }
}

// Tạo đối tượng với giá trị mặc định
$myCar = new Car();
echo $myCar->getCarInfo(); // Output: This car is a White Unknown

Giải thích:

  • Constructor nhận hai tham số $color$brand với các giá trị mặc định lần lượt là "White""Unknown".
  • Nếu bạn không cung cấp bất kỳ giá trị nào khi tạo đối tượng (như trong ví dụ trên), các giá trị mặc định sẽ được sử dụng.

6. Constructor kế thừa trong class con

Trong PHP, nếu một class con kế thừa từ class cha và không khai báo constructor riêng, nó sẽ tự động sử dụng constructor của class cha. Tuy nhiên, nếu class con có constructor riêng, constructor của class cha sẽ không tự động được gọi. Bạn có thể sử dụng từ khóa parent::__construct() để gọi constructor của class cha từ class con.

Ví dụ:

php
class Vehicle {
    public $engine;

    // Constructor class cha
    public function __construct($engine) {
        $this->engine = $engine;
    }
}

class Car extends Vehicle {
    public $color;

    // Constructor class con
    public function __construct($engine, $color) {
        parent::__construct($engine); // Gọi constructor của class cha
        $this->color = $color;
    }

    public function getCarInfo() {
        return "This car has a " . $this->engine . " engine and is " . $this->color;
    }
}

$myCar = new Car("V6", "Red");
echo $myCar->getCarInfo(); // Output: This car has a V6 engine and is Red

Giải thích:

  • Class Vehicle có constructor nhận tham số $engine.
  • Class Car kế thừa từ class Vehicle và có constructor riêng nhận thêm tham số $color.
  • Bên trong constructor của class con Car, chúng ta sử dụng parent::__construct($engine) để gọi constructor của class cha và truyền giá trị cho thuộc tính $engine.

7. Kết luận

Constructor là một thành phần rất quan trọng trong lập trình hướng đối tượng vì nó cho phép bạn thiết lập các thuộc tính ban đầu của đối tượng khi nó được tạo ra. Sử dụng constructor giúp mã của bạn trở nên dễ bảo trì, dễ đọc và quản lý hơn. Bạn có thể khai báo constructor với nhiều tham số, thiết lập giá trị mặc định cho các tham số đó, hoặc kế thừa constructor từ các class cha.

Trong bài học tiếp theo, chúng ta sẽ tiếp tục khám phá các khái niệm nâng cao hơn trong lập trình hướng đối tượng với PHP, bao gồm destructor, kế thừa, đa hình, và interface.