Các hàm magic trong PHP

Sun, 05 Dec 2010

Mặc dù không có bất kì gậy phép thuật nào ở đây nhưng các hàm này vẫn được gọi là những hàm “ma thuật” vì những việc nó làm trong PHP vô cùng là kì bí. Chúng ta sẽ cùng nhau điểm qua các hàm thường sử dụng trong PHP để mọi người hiểu rõ hơn cách thức hoạt động của từng hàm.

__construct()

Đây làm hàm khởi tạo, một hàm được dùng rất phổ biến trong PHP. Hàm này sẽ được tự động gọi khi bạn khởi tạo 1 lớp. Nó thường được là hàm được khai báo đầu tiên trong một lớp, việc này đồng nghĩa với việc chúng ta có thể sử dụng để khởi tạo các giá trị mặc định cho các thuộc tính trong lớp

class Animal {

  public function __construct() {
    $this->name = 'Puppy';
    $this->legs = 4;
  }
}

và thường là chỗ để chúng ta có thể gọi lên hàm khởi tạo ở lớp cha trong trường hợp chúng ta mở rộng một lớp nào đó

class Animal {

  public function __construct($name, $legs) {
    $this->name = $name;
    $this->legs = $legs;
  }
}

class Dinosaur extends Animal {

  public function __construct() {
    parent::__construct('T-rex', 2)
  }
}

__destruct()

Ngược lại với hàm khởi tạo hàm __destruct được gọi khi một lớp bị hủy và không còn được sử dụng nữa. Nhiệm vụ của hàm này là sẽ dọn dẹp hết các tài nguyên mà lớp đó đã sử dụng khi khởi tạo lên. Một hàm __destruct trong PHP sẽ được khai báo và sử dụng như sau:

class FileReader {

  public function __construct() {
    $this->file_path = fopen('/path/to/file/text.txt', 'w');
  }

  public function __destruct() {
    fclose($this->file_path);
  }
}

Nhưng trên thực tế hàm này ít được sử dụng vì PHP là một ngôn ngữ kịch bản nên vòng đời của một tiến trình PHP thường là rất ngắn ngủi, dẫn đến việc thu gom chiến trường đã có bộ dọn rác PHP và hệ điều hành đảm nhận.

__get()

Hàm này được gọi tự động khi bạn cố gắng truy cập vào một thuộc tính không tồn tại trong một lớp.

  public function __get($field) {
    // Xử lý lấy giá trị của tên $field được truyền vào
  }

__set()

Tương tự với hàm __get() hàm này được gọi khi bạn cố gắng gán một giá trị vào một thuộc tính không có trong một lớp.

  public function __set($field, $value) {
    // Gán giá trị vào thuộc tính với tên $field được truyền vào.
  }

Vậy câu hỏi đặt ra là tại sao và khi nào chúng ta sẽ sử dụng 2 hàm __get()__set() này. Bởi vì công việc 2 hàm này đảm nhận tương đối là kì cục?

Tưởng tượng rằng bạn đã xây dựng các lớp nền tảng (Base Class) thật là hoàn hảo và được sử dụng rất nhiều nơi trong ứng dụng của mình, nhưng vô tình một ngày đẹp trời sếp đạp cửa vào phòng nói là cần phải thay đổi lại giá trị trả về của 1 field trong đó. Cụ thể là không được dùng field name nữa mà phải thay thế lại là username. Lúc đó bạn mới tá hỏa không lẽ giờ phải đi thay đổi lại hơn cả trăm file đang sử dụng, chưa kể là việc thay thế như vậy sinh ra vô vàn là lỗi. Đó chính là lúc cần đến sự ma thuật của PHP, cùng xem qua cách thực hiện này nhé

class User {
  // private $name;  Tạm đưa em vào dĩ vãng vì giờ đã có em mới thay thế
  private $username;

  public function __get($field) {
    if($field == 'name') {
      return $this->username;
    }
  }

  public function __set($field, $value) {
    if($field == 'name') {
      $this->username = $value;
    }
  }
}

Woaaa, thật vô cùng kì diệu, cám ơn những gì PHP đã mang lại cho tôi !!!!

__call()

Đã bao nhiêu lần bạn thấy dòng thông báo lỗi dạng như thế này?

PHP Fatal error: Call to undefined method Animal::walk() in ...

Hãy cùng tìm hiểu thêm một hàm ma thuật nữa để xem có thể giúp gì cho chúng ta khắc phục được lỗi này không nhé.

Hàm __call() được tự động gọi khi bạn cố gắng gọi đến một hàm không tồn tại trong một lớp. Điều này mới nghe có phần hơi vô lý khi PHP tạo ra một hàm như thế này, nhưng nó thực sự rất hữu dụng nếu như bạn đang viết một thư viện cho người khác sử dụng và bạn muốn quản lý các lỗi gọi sai hàm và trả về một thông báo rất chi là lịch sự

Giống khi bạn gọi nhầm số điện thoại, sẽ có em tổng đài với giọng nói dịu dàng hướng dẫn bạn quay lại số khác

class Customer {
  //...

  public function __call($method, $args) {
    echo "Số điện thoại quý khách vừa gọi ($method) không đúng. Xin vui lòng quay lại số khác hoặc gọi lại số ...";
    return false;
  }
}

__toString()

Như cái tên hàm này thì các bạn cũng phần nào đoán ra nhiệm vụ của nó. Nhiệm vụ của hàm này là chuyển đối tượng thành kiểu chuỗi khi bạn cố gắng sử dụng đối tượng như một kiểu chuỗi. Ví dụ như sử dụng các hàm print hoặc echo

class Animal {

  public function __toString() {
    return "It is a " . $this->name . " with " . $this->legs . " legs.";
  }
}

$animal = new Animal('T-rex', 2);
echo $animal; // It is a T-rex with 2 legs.

Kết nhẹ

Trên đây mình liệt kê các hàm mình hay sử dụng khi làm việc với PHP và các trường hợp cụ thể mình cần đến chúng. Mình nghĩ những cái này cũng như bí kíp võ công còn cách vận dụng biến hóa như thế nào là còn tùy thuộc vào người sử dụng chúng.

Hy vọng sau bài viết này mọi người sẽ hiểu hơn các hàm ma thuật của PHP và sử dụng hiệu quả cho dự án của mình.

Ngoài ra còn có vài PHP Magic Method các bạn có thể tham khảo thêm ở đây: https://secure.php.net/manual/en/language.oop5.magic.php

Loading...