07/09/2018, 10:42

Tìm Hiểu Về Getter và Setter (Magic Method) trong PHP

Nếu bạn từng sử dụng một số MVC framework phổ biến trong PHP bạn sẽ thấy rất nhiều trong số này cho phép chúng ta truy cập trực tiếp các property với visibility là private hoặc protected . class Product extends Model { private $manufacture; private $name; private $model; ...

Nếu bạn từng sử dụng một số MVC framework phổ biến trong PHP bạn sẽ thấy rất nhiều trong số này cho phép chúng ta truy cập trực tiếp các property với visibility là private hoặc protected.

class Product extends Model {
    private $manufacture;
    private $name;
    private $model;
    private $price;
}

$iPhone = new Product;
$iPhone->manufacture = 'Apple';
$iPhone->name = 'iPhone 7';
$iPhone->model = 'A1778';
$iPhone->price = '$900 USD';

Ở trên các property như $manufacture, $model và $price đều có các private property tuy nhiên khi khởi tạo object $product chúng ta vẫn có thể gán giá trị cho chúng giống như các public property. Điều này được thực hiện thông qua sử dụng PHP Magic Method.

PHP Magic Method Là Gì

PHP magic method là các method đặc biệt của PHP cho phép chúng ta tuỳ chỉnh cách thức hoạt động của object.

Một magic method phổ biến mà chúng ta hay sử dụng đó là __construct() được tự động gọi khi khởi tạo object:

class Cat {
    public $name;
    public function __construct()
    {
        $this->legCount = 4;
        $this->hasTail = true;
    }
}

$myCat = new Cat;
$myCat->name = "Kitty";

var_dump($myCat);

Trong kết quả trả về của đoạn code trên bạn sẽ thấy các thuộc tính như $legCount, $hasTail trong object $myCat được tự động gán giá trị bởi method __construct():

class Cat#1 (3) {
  public $name =>
  string(5) "Kitty"
  public $legCount =>
  int(4)
  public $hasTail =>
  bool(true)
}

Setter và Getter trong PHP

Trong lập trình hướng đối tượng, với các property có visibility khác với public (bao gồm private hoặc protected) thì chúng ta sẽ thường sẽ khai báo thêm các setter() hoặc getter() method vào class để có thể thực hiện các tác vụ lấy ra (hoặc gán) giá trị cho các property này.

Ví dụ:

class Product {
    private $manufacture;
    private $model;
    private $price;
    public function getManufacture ()
    {
        return $this->manufacture;
    }

    public function setManufacture ($manufacture)
    {
        $this->manufacture = $manufacture;
    }

    // Các getter và setter method cho các propert khác...
}

$iPhone = new Product;
$iPhone->setManufacture('Apple');

echo $iPhone->getManufacture(); // Apple

Ở ví dụ trên hai method getManufacture() và setManufacture() được gọi lần lượt là các gettersetter method.

__get() và __set() trong PHP

Ngoài __construct() thì hai method __get() và __set() cũng được sử dụng khá phổ biến. Hai magic method được sử dụng để triển khai các gettersetter method trong class một cách thuận tiện.

class Product {
    private $manufacture;
    private $name;
    private $model;
    private $price;

    public function __get($propertyName)
    {
        return $this->$propertyName;
    }

    public function __set($propertyName, $propertyValue)
    {
        $this->$propertyName = $propertyValue;
    }
}

$iPhone = new Product;
$iPhone->manufacture = 'Apple';
$iPhone->name = 'iPhone 7';
$iPhone->model = 'A1778';
$iPhone->price = '$900 USD';

echo $iPhone->manufacture;  // Apple
echo $iPhone->name;  // iPhone 7
// ...

Ở trên sử dụng __get() và __set() giúp giảm số lượng code xuống đáng kể, thay vì phải viết tất cả các gettersetter cho từng property của class chúng ta chỉ cần thực hiện công việc này một lần duy nhất.

Kết Luận

Trong bài viết này, chúng ta đã cùng nhau tìm hiểu về PHP Magic Method và cách sử dụng __get() và __set() để thêm vào các gettersetter method cho class. Thực chất các khái niệm này không khó để có thể hiểu và vận dụng tuy nhiên việc do cách hoạt động khá magic của chúng nên nhiều người mới học cảm thấy việc lập trình với framework có vẻ phức tạp và hết sức thần thánh. Bản thân tôi cũng không phải là ngoại lệ tuy nhiên nếu chịu khó tìm hiểu thì bạn sẽ thấy được lập trình không phải là một công việc phức tạp đòi hỏi đầu óc cao siêu ngược lại nó khá thú vị.

0