PHP中常用的魔术方法
__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();
//结果: 你还想调用我?
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 keyblue的博客!
评论