Magic method

Chúng ta đã biết các magic method của PHP bao gồm __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(). Bài này sẽ đề cập đến một số magic hữu dụng khác bao gồm __toString(), __invoke(), __debugInfo()__set_state().

Magic method

Đầu tiên là tất cả các magic method đều bắt đầu bằng hai ký tự gạch dưới __ và không thể gọi trực tiếp. Thứ hai là tất cả các magic method đều phải ở dạng public.

Hàm __toString()

Hàm __toString() sẽ được gọi khi chuyển object thành dạng string, ví dụ như câu lệnh echo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
class TestClass {
  public $foo;
  public function __construct($foo) {
    $this->foo = $foo;
  }
  public function __toString() {
    return $this->foo;
  }
}

$class = new TestClass('Hello');
echo $class; // -> Hello

Hàm __invoke()

Khi thực thi một object thì hàm __invoke() được gọi. Hàm này được thêm vào từ phiên bản PHP 5.3.0

1
2
3
4
5
6
7
8
9
<?php
class CallableClass {
  public function __invoke($x) {
    var_dump($x);
  }
}
$obj = new CallableClass;
$obj(5); // thực thi object với tham số 5 <=> gọi hàm __invoke(5)
var_dump(is_callable($obj)); // -> bool(true)

Hàm __debugInfo()

Hàm này sẽ thực thi khi chạy var_dump() với tham số là object. Hàm này được thêm vào từ phiên bản PHP 5.6.0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class C {
  private $prop;

  public function __construct($val) {
    $this->prop = $val;
  }

  public function __debugInfo() {
    return [
      'Giá trị bình phương là' => $this->prop ** 2,
    ];
  }
}

var_dump(new C(5));
/*
-> object(C)#1 (1) {
  ["Giá trị bình phương là"]=>int(25)
}
*/

Hàm __set_state()

Hàm __set_state()hàm static trả về một đối tượng mới với tham số nhận vào là một mảng các thuộc tính. Hàm __set_state() có thể gọi được trực tiếp. Hàm này được thêm vào từ phiên bản PHP 5.1.0

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class A {
  public $var1;
  public $var2;

  public static function __set_state($an_array) {
    $obj = new A;
    $obj->var1 = $an_array['var1'];
    $obj->var2 = $an_array['var2'];
    return $obj;
  }
}
$a = A::__set_state(array(
  'var1' => 5,
  'var2' => 'foo',
));

var_dump($a); 
/*
-> object(A)#1 (2) {
  ["var1"]=> int(5)
  ["var2"]=> string(3) "foo"
}
*/

Hàm var_export đưa về dạng khởi tạo của một biến dưới dạng string.

1
2
3
<?php
$a = [1,2,3];
var_export($a); // -> array(1,2,3)

Hàm var_export khi sử dụng với object sẽ trả về hàm __set_state() của object.

1
2
3
4
5
6
7
<?php
class A {
  public $var;
};
$a = new A();
$a->var = 1;
var_export($a); // -> A::__set_state(array('var' => 1))