Bài 03: Các phương thức magic trong OPP PHP

Nhằm giúp sử dụng hiệu quả các object trong hướng đối tượng, PHP cung cấp cho lập trình viên phương thức magic.Phương thức magic là những phương thức được đặt tên với kí tự đặc biệt, bắt đầu với dấu 2 gạch dưới. Cú pháp : __method() Khi một phương thức được đặt tên với dấu 2 gạch dưới, điều ...

Nhằm giúp sử dụng hiệu quả các object trong hướng đối tượng, PHP cung cấp cho lập trình viên phương thức magic.Phương thức magic là những phương thức được đặt tên với kí tự đặc biệt, bắt đầu với dấu 2 gạch dưới.

Cú pháp: __method()

Khi một phương thức được đặt tên với dấu 2 gạch dưới, điều đó là dấu hiệu để PHP nhận biết đây là phương thức magic, và nó sẽ kích hoạt các tính năng đặc biệt của loại phương thức này. Nó chỉ đơn thuần là những hàm được xây dựng sẵn, nhằm mục đích thực hiện một tác vụ nào đó hữu ích cho lập trình.

1. Phương thức magic __contruct

Đây được gọi là một contructor, nó là một phương thức magic, luôn được gọi đầu tiên khi một đối tượng được khởi tạo. Vì nó là phương thức được gọi đầu tiên, nên thường được ứng dụng theo mong muốn của người phát triển.

Người phát triển hay ứng dụng nó làm hàm khởi tạo , các hàm kết nối database, hàm gọi các model, view, controller trong MVC v..v

Ví dụ:

// Xây dựng lớp Animal
class Animal {
    // Định nghĩa phương thức magic contructor
    public function __construct() {
        echo "__Construct";
    }
}
// Khởi tạo đối tượng Animal
$animal = new Animal; //Kết quả: __Construct

Bạn sẽ có một câu hỏi là tại sao chỉ cần khởi tạo phương thức, chưa thực hiện truy xuất một action nào cả mà đã xuất ra màng hình. Đơn giản bởi vì đây chính là phương thức luôn được gọi đầu tiên khi khởi tạo object. Và một câu hỏi khác là giờ mình muốn khởi tạo một đối tượng với các thuộc tính được truyền vào thì sao?

Cũng giống như các phương thức được đĩnh nghĩa sẵn hay các phương thức bạn tạo ra thì các phương thức magic cũng cho phép bạn truyền vào nó những tham số mà bạn cần.

// Xây dựng lớp Animal với 2 thuộc tính height và weight
class Animal {
    public $height;
    public $weight;
    // Định nghĩa phương thức contructor
    public function __construct($height,$weight) {
        $this->height = $height;
        $this->weight = $weight;
    }
}
// Khởi tạo đối tượng Animal với 2 thuộc tính chiều cao và cân nặng
$animal = new Animal(2,100);

// Lấy ra các giá trị của thuộc tính chiều cao và cân nặng
echo "Chiều cao là: ".$animal -> height; // Kết quả: 2
echo "Cân nặng là: "$animal -> weight; // Kết quả: 100

2. Phương thức magic __destruct

Trái ngược với phương thức __contruct, phương thức __destruct được gọi là hàm hủy, sẽ được gọi cuối cùng, nhằm mục đích để hủy đi một tác vụ nào đó, chẳng hạn như đóng kết nối cơ sở dữ liệu.

Ví dụ:

class Animal {
    public $height;
    public $weight;
    // Định nghĩa phương thức magic contructor
    public function __construct($height,$weight) {
        echo "Tôi là phương thức khởi tạo";
    }
    public function __destruct(){
        echo "Tôi là phương thức hủy";
    }
}
// Khởi tạo đối tượng animal
$animal = new Animal(); 
// Kết quả:
Tôi là phương khởi tạo
Tôi là phương thức hủy

3. Phương thức magic __toString

Điều gì sẽ xảy ra khi bạn cố gắng dùng lệnh echo cho một class? Chắc chắn lỗi (fatal error) sẽ xảy ra. Nhưng với phương thức magic__toString của OOP, bạn có thể echo một class ra dễ dàng. Phương thức này được khai báo để ghi đè lên hành vi của một đối tượng và ép nó phải xuất ra một chuỗi khi có lệnh echo.

class Animal{
  public $weight = 100;
  public function __construct($weight) {
      $this->weight = $weight;
  }
  public function __toString() {
      return $this->weight;
  }
}
$animal = new Animal;
echo $animal;// Kết quả: 100

Vậy một câu hỏi đặt ra là tại sao phải dùng hàm __toString(), trong khi chúng ta có thể lấy đối tượng và trỏ đến một phương thức nào đó ? Vấn đề chính là ở đây, thay vì khi bạn muốn xem một cái output đầu ra của một phương thức trong class, bạn phải khỏi tạo một đối tượng, rồi dùng con trỏ -> để truy xuất phương thức, thì với những lập trình viên hơi “lazy”, họ muốn output đầu ra nhanh để debug hay thực hiện một ý đồ nào đó, chỉ việc echo đối tượng đó ra là xong.


4. Một số phương thức magic khác.

a) public void __set ( string $name , mixed$value ) : xuất hiện khi ta truyền dữ liệu cho một thuộc tính không được phép truy cập.

b) public mixed__get ( string $name ) : được dùng khi đọc dữ liệu từ một thuộc tính không được phép truy cập.

c) public bool __isset ( string $name ): được kích hoạt khi gọi hàm isset() hoặc empty() trên một thuộc tính không được phép truy cập.

d) public void __unset ( string $name ): được gọi khi hàm unset() được sử dụng trong một thuộc tính không được phép truy cập.

e) public mixed__call( string $name , array $arguments ): được kích hoạt khi ta gọi một phương thức không được phép truy cập trong phạm vi của một đối tượng.

f) public static mixed__callStatic( string $name , array $arguments ): được kích hoạt khi ta gọi một phương thức không được phép truy cập trong phạm vi của một phương thức tĩnh.

g) mixed__invoke ([ $... ] ): phương thức này được gọi khi một lệnh cố gắng gọi một đối tượng như một hàm. 

Ví dụ:

class CallableClass{
	public function __invoke($x){
		echo 'Giá trị của tham số bạn truyền vào :'.$x;
	}
}
// Khởi tạo một đối tượng.
$callable = new CallableClass();
// $callable là một đối tượng
$callable(5); // Kết quả: 5
echo '
'; echo is_callable($callable); // Kết quả: TRUE
    0