PHP常见魔术方法

等风来,不如追风去


PHP提供了许多“魔术”方法,这些方法由两个下划线前缀 __ 标识。它们充当拦截器,在满足某些条件时会自动调用它们,魔术方法提供了一些极其有用的功能

常见的魔术方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
__contruct() 当一个对象创建时被调用

__destruct() 当一个对象销毁前被调用

__sleep() 在对象被序列化前被调用

__wakeup() 将在反序列化之后立即被调用

__toString() 当一个对象被当做字符串使用时被调用

__get() 当获取类的私有属性或不存在的属性时调用此方法
·
__set() 当给类中不存在的属性或私有属性赋值时调用此方法

__invoke() 调用函数的方式调用一个对象时的回应方法

__call() 调用类不存在的方法或该方法不可访问(私有方法)时自动调用

__callStatic() 调用类不存在的静态方法或该方法不可访问(私有方法)时自动调用

__construct()

  • 对象创建时被调用
1
2
3
4
5
6
7
8
<?php
class Name{
function __construct(){
echo "this is __construct function";
}
}

$a = new Name();

Assassins小白


__destruct()

  • 对象销毁前被调用
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class Name{
function __destruct(){
echo "this is __destruct function";
}
function test(){
echo 'test content'."\\n";
}
}

$a = new Name();
$a->test();

程序执行完毕后触发 __destruct() 魔术方法

Assassins小白

unset对象后,触发

Assassins小白


__sleep()

  • 在对象被序列化前被调用
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class Name{
function __sleep(){
echo "this is __sleep funciton";
}
function test(){
echo "testa";
}
}

$a = new Name();
serialize($a);

Assassins小白


__wakeup()

  • 在反序列化一个对象成功后,会自动调用该方法
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class Name{
function __wakeup(){
echo "this is __wakeup funciton";
}
function test(){
echo "testa";
}
}

$a = new Name();
$b = serialize($a);
$c = unserialize($b);

Assassins小白


__toString()

  • 当一个对象被当做字符串使用时被调用
  • 该方法没有任何参数,也不会传递任何参数,但该方法必须有一个返回值,该返回值必须是字符串,且只能是字符串
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class Name{
function __toString(){
return "this is __toString funciton";
}
function test(){
echo "testa";
}
}

$a = new Name();
echo $a;

Assassins小白


__get()

  • 获取类的私有属性或不存在的属性时调用此方法
  • get函数需要设置有一个参数

1、获取类的私有属性

Assassins小白

2、获取不存在的属性

Assassins小白


__set()

  • 给类中不存在的属性或不可访问的属性赋值
  • set函数需要设置有两个参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Name{
private $test = "tett"; //私有变量

function __get($b){
echo "this is __get funciton";
}

function __set($v,$k){
echo "this is __set funciton";
}
}

$a = new Name();
$a->test=123; // 给私有属性赋值

1、给私有属性赋值

Assassins小白

2、给不存在的属性赋值

Assassins小白


__invoke()

  • 调用函数的方式调用一个对象时的回应方法
1
2
3
4
5
6
7
8
9
10
11
<?php
class Name{
function __invoke(){
echo "this is __invoke funciton";
}
function test(){
echo 'tests';
}
}
$a = new Name();
$a();

Assassins小白


__call

  • 调用类中不存在的方法或私有方法时执行
  • 该方法有两个参数,第一个参数是调用的那个不存在的 方法名 ,第二个参数是一个数组 ( array ) ,是传递给不存在方法的所有参数组成的数组
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class Name{
function __call($v,$k){
echo "this is __call function";
}
private function test(){ // 私有方法
echo "test1";
}
}

$a = new Name();
$a->test();

1、调用类中的私有方法

Assassins小白

2、调用类中不存在的方法

Assassins小白


__callStatic()

  • 在调用类的一个不存在的静态方法或该方法不可访问(私有方法)时自动调用,作用和原型都类似于 __call()
  • 该方法同样有两个参数,第一个参数是调用的那个不存在的静态方法名 ,第二个参数是一个数组 ( array ) ,是传递给不存在静态方法的所有参数组成的数组
  • 该方法要设置为静态方法(前面要加上一个static),否则会报Warning警告
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class Name{
static function __callStatic($v,$k){
echo "this is __callStatic function";
}
static private function test(){ // 私有静态方法
echo "test function";
}
}

$a = new Name();
$a::test();

1、调用私有静态方法

Assassins小白

2、调用不存在的静态方法

Assassins小白