• About

Viet PHP

PHP = ['newbie' => 'cơ bản', 'coder' => 'nâng cao', 'professional'=>'chuyên sâu']

  • PHP
    • OOP
    • Basic
  • WordPress
  • Bài tập PHP
  • PHP 7
Home PHP OOP Các magic methods của PHP khi lập trình OOP, trường hợp __toString() và __invoke()

Các magic methods của PHP khi lập trình OOP, trường hợp __toString() và __invoke()

Posted on April 9, 2018 Written by admin 1 Comment

Đây là các phương thức huyền diệu, aka magic methods dùng với OOP khi mần PHP:

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() and __debugInfo()

Hay dùng nhất có lẽ là __construct(), hàm này cho phép tự động khởi tạo và gán giá trị mỗi lần một object mới được tạo từ class đã dựng sẵn. Hàm __construct ()truyền tham số (arguments) từa lưa nên rất tiện.

Ví dụ:

class ABC{
var $a;
var $b;
public function __construct($a, $b){
$this->a = $a;
$this ->b = $b;
}

}

//Khi khởi tạo một object mới từ class thì PHẢI truyền vào hai tham số cho hàm __construct. Ví dụ

$a = new ABC('tham số 1', 'tham số 2');
echo $a->a; // Kết quả là 'tham số 1'.

Bài này sẽ bàn về hai tham số khác khá dzui là __toString() và __invoke().

  1. __toString()

Nghe tên hàm đã thấy có một sự liên hệ nhẹ với echo và print. Đây là định nghĩa của PHP:

The __toString() method allows a class to decide how it will react when it is treated like a string. For example, what echo $obj; will print. This method must return a string, as otherwise a fatal E_RECOVERABLE_ERROR level error is emitted.

Ta biết rằng object khi khởi tạo từ class không thể print hoặc echo, bắt buộc phải var_dump() mới hiển thị được. Vậy __toString() sinh ra để làm việc này. Điểm đặc biệt là khi echo hoặc print tên của object khởi tạo từ class, giá trị từ hàm __toString() sẽ được gọi ra. Quan sát code sau:

class CMD
{
    private $name;
    private $class = 'CMD';

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

    }

    public function __toString()
    {
        return "Đây là hàm __toString() của tham số truyền vào là $this->name của class $this->class<br>";
    }

 }

$a = new CMD ('Vượng');

echo $a;  // Nếu không có hàm __toString() thì lỗi ngay. Object of class CMD could not be converted to string

// Kết quả in ra là

Đây là hàm __toString() của tham số truyền vào là Vượng của class CMD

Như vậy, cứ khi nào khởi tạo một object từ class mà echo hoặc print cái object đó thì kết quả sẽ xuất ra từ hàm __toString() return lại. Lưu ý hàm này KHÔNG NHẬN ARGUMENT.

2. Hàm __invoke()

Trong tiếng Anh, invoke là gợi nhắc, nhắc nhớ. Hàm này được PHP định nghĩa như sau:

The __invoke() method is called when a script tries to call an object as a function.

Giờ thì hiểu vì sao __invoke() và __toString() lại đi với nhau cặp bài trùng. Hóa ra, nếu mừ đối xử với thằng object khởi tạo từ class là string thì mời anh dùng cái _toString(), còn nếu coi cái object đó là function, mời anh dùng __invoke(). Tóm váy lại là:

nếu

+ object ==> string, dùng __toString()

+object ==> function, dùng __toinvoke().

Okey, giờ xét code sau:

class CMD
{
    private $name;
    private $class = 'CMD';

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

    }

    public function __toString() // khi echo biến, nó hiện ra kết quả dưới
    {
        return "đây là hàm __toString() của tham số truyền vào là $this->name của class $this->class<br>";
    }

    public function __invoke($a){

        echo "Đây là cái gì đó từ hàm __invoke nè $a";
    }
}

// echo new CMD;

$a = new CMD ('Vượng');

echo $a;

/*gọi hàm __invoke vì object mới này coi nó là function*/

echo $a('Việt PHP'); // Kết quả: Đây là cái gì đó từ hàm __invoke nè Việt PHP

Hàm __invoke() có thể nhận tham số (argument) nên trong đoạn code trên ta truyền vào tham số $a.

Điểm khác biệt lớn nhất khi echo $a và echo $a (‘Việt PHP’) là ở chỗ với echo $a, ta coi đây là một string và nó sẽ tự động gọi function __toString(), còn trường hợp 2, nó coi đây là một function và nó gọi function __invoke(), bạn có thể thấy kết quả truyền vào tham số và nhận kết quả trả về “Đây là cái gì đó từ hàm __invoke nè $a“; ==> “Đây là cái gì đó từ hàm __invoke nè Việt PHP“;

Đùng là ảo diệu, magic có khác. Qua bài này thì chú ý rằng, đây là object nên echo hay print lỗi ngay, do đó mới cần các hàm trên.

Filed Under: OOP

Comments

  1. vĩ says

    April 9, 2018 at 1:06 pm

    Dùng magic CONSTANT NHƯ __CLASS__ để gọi class thì hay hơn/

    Reply

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • 11 basic PHP questions.
  • How to pass a variable to the callback function provided by Laravel Collection
  • Cài Sodium trên PHP 7.2 Centos
  • Dependency Injection và Container
  • Hàm array_map() và array_walk()

Recent Comments

  • Vượng on annonymous class trên PHP 7
  • admin on Dependency Injection
  • Vượng on Dependency Injection
  • vượng on Dependency Injection
  • vượng on Dependency Injection

Archives

  • November 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018

Categories

  • Bài tập PHP
  • Basic
  • Laravel
  • OOP
  • OOP
  • PHP
  • String
  • Uncategorized
  • WordPress

Meta

  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org

Copyright © 2018 · Focus Pro on Genesis Framework · WordPress · Log in