DANH MỤC: PHP HƯỚNG ĐỐI TƯỢNG

Bài 19: Magic methods set và get trong PHP


Ở bài trước mình đã giới thiệu với mọi người 15 magic methods trong PHP nhưng ở bài đó mình mới chỉ dừng lại ở khái niệm, còn về thực hành hay các vấn đề liên quan đến từng phương thức mình chưa nhắc tới.

Và bài này mình sẽ giới thiệu với mọi người về 2 phương thức __set() và __get().

1, Tổng quan.

Nhìn chung thì cả phương thức set và get trong PHP đều cho phép chúng ta truy cập vào các thuộc tính mà phạm vi của nó không cho phép chúng ta tác động từ bên ngoài như private.

__SET()

-Phương thức __set() sẽ tự động được gọi khi chúng ta thiết lập giá trị cho một thuộc tính không được phép truy cập từ bên ngoài, hoặc không tồn tại.

Cú Pháp:

public function __set($key, $value)
{
    //code
}

Trong đó:

  • $key là tên của thuộc tính cần xét.
  • $value là giá trị của thuộc tính cần xét đó.

VD:

<?php

class ConNguoi
{
    private $name;

    public function __set($key, $value)
    {
        //kiểm tra xem trong class có tồn tại thuộc tính không
        if (property_exists($this, $key)) {
            //tiến hành gán giá trị
            $this->$key = $value;
        } else {
            die('Không tồn tại thuộc tính');
        }
    }

    public function getName()
    {
        echo $this->name;
    }
}

$connguoi = new ConNguoi();

$connguoi->name = "Vũ Thanh Tài";

$connguoi->getName();

//Vũ Thanh Tài
$connguoi->age = 20;
//Không tồn tại thuộc tính

VD: Chứng minh phương thức __set() không được gọi khi đối tượng được truy cập từ bên ngoài hoặc không tồn tại.

<?php

class ConNguoi
{
    public $name;

    public function __set($key, $value)
    {
        die('Phương thức __set() được gọi');
    }

    public function getName()
    {
        echo $this->name;
    }
}

$connguoi = new ConNguoi();

/*gọi thuộc tính được phép truy cập*/
$connguoi->name = "Vũ Thanh Tài";
$connguoi->getName();
//Vũ Thanh Tài

/*gọi thuộc tính được phép truy cập*/
$connguoi->age = 20;
//Phương thức __set() được gọi

__GET()

-Phương thức __get() sẽ tự động được gọi khi chúng ta lấy ra giá trị của các thuộc tính trong đối mà chúng ta không được phép truy cập nó từ bên ngoài hoặc không tồn tại.

Cú Pháp:

public function __get($key)
{
   //code
}

Trong đó: $key là tên của thuộc tính mà chúng ta muốn lấy ra.

VD:

<?php

class ConNguoi
{
    private $name = "Vũ Thanh Tài";

    public function __get($key)
    {
        //kiểm tra xem trong class có tồn tại thuộc tính không
        if (property_exists($this, $key)) {
            //tiến hành lấy giá trị
            return $this->$key;
        } else {
            die('Không tồn tại thuộc tính');
        }
    }

    public function getName()
    {
        echo $this->name;
    }
}

$connguoi = new ConNguoi();

echo $connguoi->name;
//Vũ Thanh Tài

$connguoi->age;
//Không tồn tại thuộc tính

VD: Chứng minh phương thức __get() không được gọi khi đối tượng được truy cập từ bên ngoài hoặc không tồn tại.

<?php 
class ConNguoi
{
    public $name = 'Vũ Thanh Tài';
    private $age = 20;
    public function __get($key)
    {
        die('Phương thức __get() được gọi');
    }
}
$connguoi = new ConNguoi();
/*gọi thuộc tính được phép truy cập*/
echo $connguoi->name;
//Kết quả: Vũ Thanh Tài

/*gọi thuộc tính không được phép truy cập*/
$connguoi->age;
//Kết quả: Phương thức __get() được gọi

2, Ưu nhược điểm của __set() và __get().

-Sau khi đọc xong phần trên thì chắc các bạn cũng đã nhận ra được các ưu điểm của nó rồi đúng không? Và ở đây mình sẽ chốt lại các ưu điểm và nhược điểm của nó như sau:

Ưu điểm:

  • Giúp cho chúng ta có thể truy xuất đến các thuộc tính không nhìn thấy được của đối tượng. Nhằm đảm bảo tính đóng gói của hướng đối tượng.
  • Và cũng nhờ nó mà chúng ta có thể hạn chế cũng như custom lại thông báo lỗi khi chúng ta truy cập đến các thuộc tính mà chúng ta không được phép truy cập hoặc không tồn tại.

Nhược điểm:

  • Làm cho chương trình của chúng ta chậm hơn một chút nhưng không đáng kể.

3, Lời kết.

-Ở phía trên mình đã giới thiệu với mọi người về khái niệm, cách sử dụng cũng như ưu nhược điểm của 2 magic methods __set() và __get() trong PHP rồi, từ đó mọi người có thể tự đưa ra kết luận cho mình.

Nguồn: Toidicode.com

Thông tin tác giả

Vũ Thanh Tài

Vũ Thanh Tài

Biển học vô biên, quay đầu là dại!

Hãy tham gia group facebook để cùng giao lưu chia sẻ kiến thức! Tham Gia