__wakeup

执行unserialize()时,先会调用这个函数

unserialize() 会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

如何绕过wakeup函数:只要反序列化时对象参数大于原参数数量即可绕过,例如

我们只需要把对象原来属性值比原来的大就行我们把1改成2
修改前:O:6:“sercet”:1:{s:12:“%00sercet%00file”;s:8:“flag.php”;}
修改后:O:6:“sercet”:2:{s:12:“%00sercet%00file”;s:8:“flag.php”;}

__destruct

这是析构函数,脚本运行结束之前会调用对象的析构函数

__construct

这是构造函数,当使用 new 关键字实例化一个对象时,构造函数将会自动调用

__toString

将当前类的类名当作变量时自动调用

此方法必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误。

  • 对一个对象进行echo操作或者print操作会触发__toString;
  • 声明的变量赋值为对象后与字符串做弱类型比较的时候就能触发__toString;
  • 声明的变量赋值为对象后进行正则匹配的时候就能触发__toString;
  • 声明的变量被赋值为对象后进行strolower的时候就能触发__toString;

__call

在对象中调用一个不存在的方法时自动调用

当程序发现对象没有定义某个方法时,就会尝试调用名为__call的方法,如果对象中有__call方法,则会调用__call方法,把不存在的方法名和参数,以数组的形式传递给__call方法。

__get

访问类中的私有成员时,如果定义了此方法,自动调用

<?php
class Person{
	/*封装私有成员属性*/
	private $name='张三';private $sex='男';private $age=12;
	/*__get()方法用来获取私有属性*/
	function __get($property_name){
		echo '在直接获取私有成员属性得时候,自动调用了这个__get()方法<br/>';
		if(isset($this->$property_name))
		{
			return ($this->$property_name);
		}else{
			return NULL;
		}
	}
}
$p1=new Person();
/*直接获取私有属性得值,会自动调用__get()的方法,返回成员属性的值*/
echo '姓名:'.$p1->name.'<br/>';
echo '性别:'.$p1->sex.'<br/>';
echo '年龄:'.$p1->age.'<br/>';

__set

给一个未定义的属性赋值时,此方法会被触发

传递的参数是被设置的属性名和值。

__invoke

调用对象名当方法使用时,自动调用

实例:

<?php 
class autofelix
{
    public function __invoke()
    {
        echo '你还想调用我?';
    }
}
 
$a = new autofelix();
 
//对象直接当函数调用
$a();
 
//结果: 你还想调用我?