PHP常用魔术方法
2019-02-11 13:40:48
PHP将所有以 __ (两个下划线)开头的类方法保留为魔术方法。下面记录一下常用的魔术方法:
__sleep
在使用 serialize() 函数时,程序会检查类中是否存在一个 __sleep() 魔术方法。如果存在,则该方法会先被调用,然后再执行序列化操作。
__wakeup
在使用 unserialize() 时,会检查是否存在一个 __wakeup() 魔术方法。如果存在,则该方法会先被调用,预先准备对象需要的资源。
__toString
__toString() 方法用于定义一个类被当成字符串时该如何处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class TestClass
{
public $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
public function __toString() {
return $this->foo;
}
}
$class = new TestClass('Hello');
echo $class; // 运行结果:Hello
__invoke
1
2
3
4
5
6
7
8
9
10
11
class CallableClass
{
function __invoke($x) {
var_dump($x);
}
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
__construct
具有 __construct 函数的类会在每次创建新对象时先调用此方法,适合在使用对象之前做一些初始化工作。
__destruct
__destruct 函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行
__set
给不可访问属性赋值时,__set() 会被调用。
__get
读取不可访问属性的值时,__get() 会被调用。
__isset
对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
__unset
对不可访问属性调用 unset() 时,__unset() 会被调用。
__call
在对象中调用一个不可访问方法时,__call() 会被调用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MethodTest{
public function __call($name, $arguments){
// Note: value of $name is case sensitive.
echo "Triggering __call method when calling method '$name' with arguments '" . implode(', ', $arguments). "'.\n";
}
}
$obj = new MethodTest;
$obj->callTest('arg1','arg2');
/*运行结果
Triggering __call method when calling method 'callTest' with arguments 'arg1, arg2'.
*/
__callStatic
在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
1
2
3
4
5
6
7
8
9
10
11
12
13
class MethodTest{
public static function __callStatic($name, $arguments){
// Note: value of $name is case sensitive.
echo "Triggering __call method when calling method '$name' with arguments '" . implode(', ', $arguments). "'.\n";
}
}
MethodTest::callStaticTest('arg3','arg4'); // As of PHP 5.3.0
/*运行结果
Triggering __call method when calling method 'callStaticTest' with arguments 'arg3, arg4'.
*/