Bài 46: Tìm hiểu set và get và Magic methods trong PHP OOP

Ngày đăng: 2024-04-14 16:17:30

Mục lục:

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

       2. Tại sao và khi nào sử dụng set và get trong php

       3. PHP Magic method __get và __set

       4. Giới thiệu Magic methods trong PHP

       5. Phương thức __call() trong PHP

       6. Phương thức __callStatic trong PHP

 

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

Set dịch sang tiếng anh nghĩa là thiết lập, còn get có nghĩa là lấy ra. Như vậy hai phương thức này 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.

Ví dụ: về set

 

class ClassName

{

    private $__username;

    private $__password;

     

    function setUsername($value){

        $this->__username = $value;

    }

     

    function setPassword($value){

        $this->__password = $value;

    }

}

 

$class = new ClassName();

$class->setUsername('thehalfheart');

$class->setPassword('freetuts.net');

 

Ví dụ: về get

 

class ClassName

{

    private $__username;

    private $__password;

     

    // SET

    function setUsername($value){

        $this->__username = $value;

    }

     

    function setPassword($value){

        $this->__password = $value;

    }

     

    // GET

    function getUsername(){

        return $this->__username;

    }

     

    function getPassword(){

        return $this->__password;

    }

     

}

 

$class = new ClassName();

 

// SET

$class->setUsername('thehalfheart');

$class->setPassword('freetuts.net');

 

// GET

echo $class->getUsername();

echo $class->getPassword();

 

Tới đây có lẽ bạn sẽ thắc mắc tại sao lại tạo các function set và get như vậy? Để trả lời thì ta vào phần 2 sau đây.

2. Tại sao và khi nào sử dụng set và get trong php

Bây giờ mình đưa ra một số trường hợp để ban hiểu rõ hơn vấn đề này. 

Trường hợp thuộc tính là private hoặc public

Nếu bạn để ý kỹ trong ví dụ trên thì hai thuộc tính $__username và $__password mình để chế độ private, như vậy ta không thể sử dụng nó ở ngoài lớp được. Nhưng đôi lúc ta muốn nó là private nhưng vẫn sử dụng được nó thì đòi hỏi ta phải truy xuất thông qua một function trung gian, và function trung gian này ta gọi là set và get.

Trường hợp muốn xử lý trước khi gán hoặc lấy dữ liệu

Trường hợp này có nghĩa là khi bạn muốn thực hiện một số thao tác nào đó trước khi người dùng gán hoặc lấy dữ liệu của thuộc tính. 

Ví dụ: xử lý get lúc gán

Giả sử như password thông thường lúc ta gán vào sẽ mã hóa md5 trước khi lưu vào trong CSDL, và mình muốn mã hóa theo quy tắc là thêm tiền tố hay hậu tố gì đó vào password trước khi mã hóa. Trong trường hợp nhiều coder làm chung dự án thì đôi lúc vấn đề này rất khó khăn, chính vì vậy đặt ra quy ước là khi gán password phải dùng set.

 

class ClassName

{

    private $__password;

     

    function setPassword($value){

        $this->__password = md5('prefix'.$value);

    }

}

 

$class = new ClassName();

$class->setPassword('titoe.net');

 

Lúc này các coder chỉ việc gọi hàm set này chứ ko cần thiết phải nhớ prefix là gì.

Ví dụ: xử lý set trước khi lấy

Khi bạn muốn hiển thị thông tin $username ra thì sẽ thêm chữ "tên đăng nhập:" vào đằng trước $username, giả sử bạn hiển thị 100 vị trí ở 100 file khác nhau. Sau này bạn không muốn hiển thị chữ tên đăng nhập đăng trước nữa mà muốn hiển thị "Your account is:" thì bạn phải vào 100 file sửa lại đúng không nào indecision, điều này quá tệ. Để giải quyết nó thì ta sẽ tạo một hàm setUsername rồi khi hiển thị ra chỉ việc gọi tới hàm này, còn nội dung của hàm này là thêm dòng chữ như yêu cầu. Như vậy lúc cần đổi lại chữ thì chỉ việc vào function setUsername này mà đổi thôi.

 

class ClassName

{

    private $__username = 'thehalfehart';

     

    function getUsername(){

        return 'Your account is '. $this->__username;

    }

}

 

$class = new ClassName();

$class->getUsername();

 

Quá đơn giản phải không nào, vấn đề được giải quyết triệt để.

3. PHP Magic method __get và __set

Trong PHP có cung cấp cho chúng ta hai hàm đặc biệt thuộc Magic methods đó là __set và __get. Hai hàm này sẽ tự động gọi khi bạn truy xuất hay gán đến một thuộc tính trong lớp.

Cú pháp hàm set__set($key, $value).

Trong đó:

  • $key là tên thuộc tính
  • $value là giá trị thuộc tính

Cú pháp hàm get__get($key).

Trong đó

  • $key là tên thuộc tính cần lấy

Ví dụ: __set trong php

 

class ClassName

{

    public $username = '';

     

    function __set($key, $value){

        if ($key = 'somekey'){

            $this->username = $value;

        }

    }

     

}

 

$class = new ClassName();

$class->somekey = 'thehalfheart';

echo $class->username; // kết quả là thehalfheart

 

Chạy lên kết quả là in ra màn hình là 'thehalfheart'. Rõ ràng mình không có gán giá trị này cho $username nhưng tại sao nó nhận? Lý do là hàm __set mình kiểm tra nếu $key == 'somekey' thì gán nó vào trong thuộc tính $username.

Ví dụ: __get trong php

 

class ClassName

{

    public $username = 'thehalfheart';

     

    function __get($key){

        if ($key == 'somekey'){

            return $this->username;

        }

    }

     

}

 

$class = new ClassName();

echo $class->somekey;

 

Ui da, kết quả hàm get cũng là  "thehalfheart". lý do như trên nhé.

4. Giới thiệu Magic methods trong PHP

Thông thường mỗi magic method sẽ được kích hoạt (trigger) ở một sự kiện nào đó mà ta tác động vào đối tượng. Ví dụ hàm __get() và __set() sẽ được gọi khi ta tiến hành gán hay lấy giá trị của các thuộc tính trong đối tượng. Và vì nó có tính đặc biệt nên bạn dễ dàng nhận biết nó qua hai dấu gạch dưới (__), nghĩa là tất cả các phương thức Magic methods đều có tên bắt đầu bằng hai dấu gạch dưới. Sau đây là danh sách các magic methods:

  • __construct(), hàm khởi tạo, được gọi khi khởi tạo mới đối tượng
  • __destruct(), hàm hủy, được gọi khi đối tượng bị hủy
  • __get(), hàm getter, được gọi khi lấy giá trị của thuộc tính
  • __set(), hàm setter, được gọi khi gán giá trị cho thuộc tính
  • __call(), hàm call, được gọi khi ta gọi đến một phương thức không tồn tại trong đối tượng
  • __callStatic(), hàm call static, được gọi khi ta gọi đến một phương thức tĩnh không tồn tại trong đối tượng
  • __isset()
  • __unset()
  • __sleep()
  • __wakeup()
  • __toString()
  • __invoke()
  • __set_state()
  • __clone()
  • __debugInfo()

 

5. Phương thức __call() trong PHP

Phương thức __call() sẽ được gọi khi bạn gọi tới một phương thức nào đó không tồn tại trong đối tượng.

Ví dụ: gọi tới phương thức không tồn tại get_by_id()

 

class Student

{

     

}

 

$student = new Student();

$student->get_by_id();

 

Chạy lên bạn sẽ nhận được một thông báo lỗi như hình dưới đây.

Bây giờ mình sẽ viết một phương thức __call() để bắt sự kiện gọi tới phương thức không tồn tại.

 

class Student

{

    public function __call($method, $params)

    {

        echo 'Tên phương thức: ' .$method . '<br/>';

        echo 'Tham số truyền vào: ' .$method . '<br/>';

        echo '<pre>';

        print_r($params);

    }

}

 

Có hai tham số truyền vào như sau:

  • $method là tên của phương thức đang gọi
  • $params là danh sách các tham số truyền vào của phương thức đó

Quay laị ví dụ, bây giờ mình gọi tới phương thức không tồn tại như sau:

 

$student = new Student();

$student->get_by_id();

 

Kết quả như sau:

Để rõ hơn thì mình gọi thêm một phương thức không tồn tại nữa:

 

$student = new Student();

$student->get_name('thehalfheart');

 

Kết quả:

6. Phương thức __callStatic trong PHP

Phương thức __callStatic() có tác dụng giống như phương thức __call() và chỉ khác nhau ở chỗ __callStatic() dùng trong trường hợp bạn gọi đến phương thức tĩnh không tồn tại.

Ví dụ: Tạo một lớp Website và gọi đến phương thức tĩnh không tồn tại

 

class Website

{

    public static function __callStatic($method, $params) {

        echo 'Tên phương thức: ' .$method . '<br/>';

        echo 'Tham số truyền vào: ' .$method . '<br/>';

        echo '<pre>';

        print_r($params);

    }

}

 

Bây giờ giả sử ta gọi tới một phương thức tĩnh không tồn tại như sau:

 

1

Website::setWebsite('titoe.net', 'thehalfheart@gmail.com');

 

Và kết quả ta nhận được:

Như vậy nó cũng có hai tham số truyền vào là:

  • $method là tên của phương thức đang gọi
  • $params là danh sách các tham số truyền vào của phương thức đó.

 

Về bài trước

 

 


Tài liệu lập trình PHP

Bài viết trong cùng chuyên mục

Góc games giải trí



Cờ caro


Butterfly


Lật hình (luyện trí nhớ)

Cờ tướng ONLINE

Xếp hình

Ghép hình

15_PUZZLE

Kill ghosts

Banchim

Planet Defense

Tower game

Tower game

Plapy Bird (NH.Đông)

Vượt chướng ngại vật



0379136392

Thông tin liên hệ: Lê Văn Thuyên - ĐT: 0379136392 ; Gmail: lethuyen0379136392@gmail.com

Comment

 +   Lê Văn Thuyên-0379136392:Cảm ơn quý vị và các bạn đã vào Website của Lê Thuyên! Lê thuyên rất mong nhận được sự góp ý của quý vị và các bạn cho sự phát triển của website này. Xin chân thành cảm ơn!

Trả lời

 *   Dũng Trung-090567448:Lê Văn Thuyên0379136392--->Ok.Anh!

Trả lời

 *   Bé Nguyễn-benguyen@gmail,com:Lê Văn Thuyên0379136392--->Good job!

Trả lời

 +   -:

Trả lời

 +   -:

Trả lời

12267