魔术方法
成员属性
变量和成员属性是一个东西
__consrtuct构造方法
在对象实例化时执行的方法
__construct()
只会在new一个对象时触发,serialiaze和unserialize都不会触发
__destruct()析构函数
__destruct()函数只会在序列化serialize()反序列化unserialize()和销毁一个对象时触发
__call
当前对象体调用一个不存在的方法时被触发
当前对象->不存在的方法
__get
访问一个对象 不存在的 变量时触发
当前对象->不存在的变量
__set
给对象的不存在的变量赋值时触发
当前对象->不存在的变量=参数值
__isset
用isset()和empty()访问不可访问的属性时触发
__unset销毁函数
销毁一个不可访问的成员属性时被触发
__sleep
序列化serialize()时触发
__wakeup
反序列化unserialize()时被触发
__toString
当前对象被当作字符串处理时 被触发也就是把对象转换成字符串
当作字符串处理:
在实例化对象之后,使用echo将其输出
__invoke
当前对象被当作函数调用时触发
总结
- __construct(),类的构造函数
- __destruct(),类的析构函数
- __call(),在对象中调用一个不可访问方法时调用
- __callStatic(),用静态方式中调用一个不可访问方法时调用
- __get(),获得一个类的成员变量时调用
- __set(),设置一个类的成员变量时调用
- __isset(),当对不可访问属性调用isset()或empty()时调用
- __unset(),当对不可访问属性调用unset()时被调用。
- __sleep(),执行serialize()时,先会调用这个函数
- __wakeup(),执行unserialize()时,先会调用这个函数
- __toString(),类被当成字符串时的回应方法
- __invoke(),用调用函数的方式去调用一个对象时的回应方法
- __set_state(),调用var_export()导出类时,此静态方法会被调用。
- __clone(),当对象复制完成时调用
- __autoload(),尝试加载未定义的类
- __debugInfo(),打印所需调试信息
反序列化
序列化serialize():将对象转换成字符串,
反序列化unserialize():将转化为字符串的对象转化回来
反序列化时 使用unserialize()函数会触发魔术方法,只要能控制unserialize()入口,就能实现注入
先找能触发serialize或者unserialize的魔术方法
去实例化对象 然后去触发这个方法
比如先找`__wakeup,__sleep`方法或者`__destruct`方法用unserialize(或serialize)触发
序列化
O:对象名的长度:"对象名":对象属性个数:{s:属性名的长度:"属性名";s:属性值的长度:"属性值";}