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()
và __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()
là 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))
|