Home » Bài 4: get và set ( Magic methods __get và __set) trong PHP OOP

Bài 4: get và set ( Magic methods __get và __set) trong PHP OOP

by Tan Nguyen
14 minutes read

Ở bài viết thứ tư trong bộ series học PHP OOP này chúng ta sẽ học về hai hàm get và set, ngoài ra sẽ học thêm hai hàm liên quan là __get() và  __set() (Đều cùng là magic methods). Các bạn có thể xem lại khái niệm cũng như các ưu, nhược điểm của magic methods trong bài số 3: Magic methods trong PHP.
Đa số các ngôn ngữ khi làm việc OOP thường rất hay sử dụng hai phương thức get và set này, gần gũi nhất là JAVA, C++, C# và với PHP cũng thế. Vậy ý nghĩa cũng như công dụng của hai hàm đặc biệt này là gì?

get set __get __set php oop

Bài 4: get và set ( Magic methods __get và __set) trong PHP OOP

Nói một cách đơn giản thì phương thức setget trong PHP sẽ cho phép truy cập vào các property( thuộc tính) mà phạm vi truy cập của nó không cho phép chúng ta tác động từ bên ngoài như private hoặc protected.

Tìm hiểu về get và set trong PHP

Chính xác là trong thực tế, khi làm việc với code thì getset dùng để làm gì? Get dịch từ tiếng anh sang việt thì ta sẽ hiểu là lấy ra cái gì đó, còn Set thì có nghĩa là thiết lập hay khỏi tạo giá trị nào đó. Như vậy hai phương thức này sẽ giúp ta can thiệp vào quá trình thiết lập giá trị và lấy giá trị của một thuộc tính nào đó trong lớp.
Chúng ta hãy đi vào phần ví dụ bên dưới:

<?php
class User
{
    private $firstName;
    private $lastName;
    public function getFirstName()
    {
        return $this->firstName;
    }
    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;
    }
    public function getLastName()
    {
        return $this->lastName;
    }
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;
    }
}
$user_one = new User();
$user_one->setFirstName("Tran"); //set gia tri firstName
$user_one->setLastName("Truc"); //set gia tri lastName
echo $user_one->getFirstName() . " " . $user_one->getLastName(); //LAY RA GIA TRI VUA SET 
//output: Tran Truc

Ở ví dụ trên, ta thấy các thuộc tính (property) nằm trong class User đều có mức truy cập là private. Như vậy, để lấy ra khỏi class User và gán giá trị cho các property này thì ta sẽ phải dùng hai phương thức get và set. Đối với ví dụ này phương thức get  được ví dụ bởi hai hàm getFirstName()getLastName(), còn phương thức set được thể hiện qua hai hàm setFirstName() setLastName().
Như vậy, hàm setFirstName() setLastName() sẽ khỏi tạo giá trị mới, Sau đó ta gọi hai hàm get như trên ví dụ để có thể xuất ra màn hình.

Lưu ý: Để truy xuất các thuộc tính động trong chính class đó thì chúng ta dùng cú pháp this-> và sau cú pháp này chúng ta không được đặt thêm dấu $ nữa.

Ví dụ: Từ snippet trên ta có ví dụ $this->$lastName là sai, cú pháp đúng phải là $this->lastName.
Xem lại kiến thức về this-> tại đây

Khi nào cần dùng get set trong PHP

Ở nhiều trường hợp khi làm việc với class, chúng ta cần phải đặt mức truy cập cho các thuộc tính trong class về dạng riêng tư (private), tức là thuộc tính đó chỉ có thể dùng được bên trong class mà không thể gọi bình thường khi code ngoài class. Nhưng cũng có đôi khi chúng ta cần gọi hoặc sử dụng chúng ở nơi khác thì đòi hỏi ta phải truy xuất thông qua một hàm (function) trung gian. Tất nhiên getget là hai hàm trung gian đó.
Nhìn lại ví dụ từ snippet ở phần trên, chúng ta thấy hai thuộc tính $firstName$lastName đều ở mức truy cập private, chúng vì thế chúng ta cần tạo ra các hàm getFirstName, setFirstName,… để làm thành hàm trung gian, nhờ đó mà ta có thể tạo và sử dụng được ở bên ngoài class User.
khi nao dung get set trong php oop
Ví dụ khác:
Bạn có một ứng dụng web có hàng chục hàng trăm trang với những chức năng khác nhau, nhưng ở mỗi trang bạn đều phải hiện thanh menu có chứa thông tin user đăng nhập. Như vậy mỗi file tương ứng mỗi trang bạn đều phải code đi code lại một đoạn lệnh gọi ra tên người dùng. Nhỡ sau này bạn cần sửa lại cách hiện tên người dùng đó trên trang, thế là bạn sẽ phải sửa cả chục cả trăm file, điều này là vô cùng không nên.
Trong khi đó bạn có một class User chứa thông tin người dùng nhưng các thuộc tính đều ở mức private, như vậy ta sẽ tạo một hàm getInfo() để return kết quả, còn hàm trăm file kia bạn chỉ cần tạo một đối tượng từ class User và gọi hàm getInfo() này. Như vậy mỗi khi muốn sửa cách hiện thông tin người dùng như thế nào đó thì bạn chỉ cần sửa trong hàm getInfo() thôi là web sẽ tự động cập nhật ở mọi nơi cho bạn!

PHP Magic method __get  __set

Các method magic  PHP __get__set hoạt động như getterssetters cho các giá trị của đối tượng. Nhưng nó có một ưu điểm hơn là bạn không cần phải khai báo các thuộc tính của đối tượng (object properties) trong class. Thay vào đó, khi bạn đặt một giá trị( với object property – thuộc tính của đối tượng chưa từng được khai báo trong class) thì phương thức magic __set sẽ tự động được gọiđặt giá trị.
Tương tự như vậy với __get, nếu không có object property được khai báo trong class mà bạn lại muốn nhận thì phương thức ma thuật __get sẽ tự động được gọinhận giá trị.
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 class 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 về __get và __set.

public function __get($name){
    //...
}
public function __set($name, $value){ 
    //... 
}

Trong đó $name là tên thuộc tính, $value là giá trị thuộc tính.

Ví dụ

Chúng ta sẽ tạo một class kids, chúng ta sẽ đặt chiều cao của trẻ thông qua phương thức __set hoặc lấy chiều cao của trẻ thông qua phương thức __get.

<?php
class kids
{
    public function __set($property, $value)
    {
        //kiem tra chieu cao cua tre tren 30 inch 
        if ($value > 30) {
            $this->property = $value;
        } else die("The child's height is invalid");
    }
    public function __get($property)
    {
        return "The child's height is " . $this->property . " inches tall";
    }
}
$kid1 = new kids;
$kid1->height = 45;
echo $kid1->height; //output: The child's height is 45 inches tall
$kid1->height_ex = 15;
echo $kid1->height_ex; //output: The child's height is invalid

Phương thức đầu tiên mà chúng ta tạo phương thức setter bằng hàm __set. Hàm setter phải chấp nhận 2 tham số là thuộc tính đối tượng bạn đang xác định và giá trị của thuộc tính đối tượng này ($property, $value).
Chúng ta làm cho nó để nếu giá trị được chuyển vào thuộc tính đối tượng lớn hơn 30, ta sẽ đặt thuộc tính đối tượng thành giá trị đó. Nếu giá trị nhỏ hơn 30, thì phương thức ma thuật __set không đặt giá trị và xuất ra kết quả không hợp lệ.
Sau đó chúng ta tạo hàm tiếp theo, phương thức getter bằng hàm __get. Hàm getter chấp nhận tham số  $property của object. Chúng ta không cần $value làm tham số, vì $value đã được đặt bởi hàm setter. Với hàm getter, chúng ta chỉ lấy lại giá trị đã được đặt.  Vì vậy, trong hàm getter này, chúng ta trả về chiều cao của trẻ tính bằng inch bằng cách gọi hàm  $this->property. $this->property dùng để chỉ giá trị của thuộc tính của đối tượng chúng ta đang nhận.
Và kết quả nhận được tương tự như giá trị output ở dòng comment trong snippet trên.

Ưu và nhược điểm của __get và __set

Ở 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 getter và setter cho từng property của class như hai hàm get và set trong PHP thì giờ đây chúng ta chỉ cần thực hiện công việc này một lần duy nhất.
Không những vậy mà nó còn 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.
Những đã có ưu thì luôn có nhược điểm bởi lẽ không có cái gì là hoàn hảo cả, đó là tốc độ xử lý của chương trình khi dùng __get __set PHP có thể sẽ giảm một chút nhưng không đáng kể.


Thông thường, khi bạn không định nghĩa các phương thức này trên class của bạn, PHP chỉ lấy ra trường (field ) khi nó được lưu trữ trong class. Tuy nhiên, bạn có thể ghi đè các phương thức này để tạo các class có thể chứa dữ liệu như một mảng, nhưng lại có thể sử dụng được như một object.

<?php
class Example
{
    private $data = [];
    
    public function __set($name, $value)
    {
        $this->data[$name] = $value;
    }
    public function __get($name)
    {
        if (!array_key_exists($name, $this->data)) {
            return null;
        }
        return $this->data[$name];
    }
}
$example = new Example();
// Stores 'a' in the $data array with value 15
$example->a = 15;
// Retrieves array key 'a' from the $data array
echo $example->a; // prints 15
// Attempt to retrieve non-existent key from the array returns null
echo $example->b; // prints nothing

Chúng ta viết hai magic method __get__set để tạo và lấy giá trị của mảng $data. Ở bên ngoài class ta lưu trữ ‘a‘ trong mảng $data có giá trị là 15 và sau đó chúng ta xuất ra giá trị key “a” từ mảng $data tương tự như xuất giá trị từ thuộc tính của đối tượng vậy.

Kết thúc

Qua bài này hi vọng các bạn có thể hiểu được khái niệm về get và set trong PHP cũng như các sử dụng nó qua các ví dụ. Ngoài ra chúng ta còn tìm hiểu qua về hai magic method __get__set trong PHP và cách ứng dụng nó vào thực tế. Chúc các bạn thành công!
Xem thêm:

Nếu các bạn cảm thấy Website TanHongIT.Com thật sự hữu ích mình mong các bạn có thể chia sẻ những bài viết đến cho cộng đồng cùng thao khảo nhé. Cảm ơn các bạn !!!

Các bạn có bất kì thắc mắc cần được hỗ trợ hay yêu cầu các phần mềm, thủ thuật, khoá học,… thì cứ để lại comment bên dưới bài viết hoặc liên hệ qua fanpage của TanHongIT để được hỗ trợ nhé! Mình sẽ cố gắng chia sẻ cho các bạn mọi thứ cần thiết nhất!

CHÚC CÁC BẠN THÀNH CÔNG VÀ VUI VẺ
5/5 - (5 votes)

Related Posts

5 2 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More

0
Would love your thoughts, please comment.x
()
x