PHP反序列化&魔术方法&原生类(二) |
您所在的位置:网站首页 › php原生类 › PHP反序列化&魔术方法&原生类(二) |
php反序列化(二)
__construct方法
只要new一个实例对象,就会自动调用__contruct方法 __destruct方法:当删除一个对象或对象操作终止时被调用。其最主要的作用是拿来做垃圾回收机制。 当对象销毁时会调用此方法 一是用户主动销毁对象,二是当程序结束时由引擎自动销毁 利用方法: 1.主动销毁unset 2.程序结束自动销毁 new() class Test{ public $name; public $age; public $string; // __construct:实例化对象时被调用.其作用是拿来初始化一些值。 public function __construct($name, $age, $string){ echo "__construct 初始化".""; $this->name = $name; $this->age = $age; $this->string = $string; } function __destruct(){ echo "__destruct 类执行完毕".""; } } // 主动销毁unset $test = new Test("Spaceman",566, 'Test String'); unset($test); //unset销毁 echo '第一种执行完毕'.''; echo '----------------------'; // 程序结束自动销毁 $test = new test("Spaceman",566, 'Test String'); echo '第二种执行完毕'.''; */ __toString():在对象当做字符串的时候会被调用利用: 1.echo class Test { public $variable = 'This is a string'; public function good(){ echo $this->variable . ''; } // 在对象当做字符串的时候会被调用 public function __toString() { return '__toString '; } } $a = new Test(); $a->good(); //输出调用 echo $a; */ __CALL 魔术方法 调用某个方法, 若方法存在,则直接调用;若不存在,则会去调用__call函数class Test{ public function good($number,$string){ echo '存在good方法'.''; echo $number.'---------'.$string.''; } // 当调用类中不存在的方法时,就会调用__call(); public function __call($method,$args){ echo '不存在'.$method.'方法'.''; var_dump($args); } } $a = new Test(); $a->good(566,'nice'); $b = new Test(); $b->spaceman(899,'no'); */ __get() 魔术方法 读取一个对象的属性时, 若属性存在,则直接返回属性值; 若不存在,则会调用__get函数class Test { public $n=123; // __get():访问不存在的成员变量时调用 public function __get($name){ echo '__get 不存在成员变量'.$name.''; } } $a = new Test(); // 存在成员变量n,所以不调用__get echo $a->n; echo ''; // 不存在成员变量spaceman,所以调用__get echo $a->spaceman; */ __set()魔术方法 设置一个对象的属性时, 若属性存在,则直接赋值; 若不存在,则会调用__set函数。class Test{ public $data = 100; protected $noway=0; // __set():设置对象不存在的属性或无法访问(私有)的属性时调用 /* __set($name, $value) * 用来为私有成员属性设置的值 * 第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。 public function __set($name,$value){ echo '__set 不存在成员变量 '.$name.''; echo '即将设置的值 '.$value.""; $this->noway=$value; } public function Get(){ echo $this->noway; } } $a = new Test(); // 读取 noway 的值,初始为0 $a->Get(); echo ''; // 无法访问(私有)noway属性时调用,并设置值为899 $a->noway = 899; // 经过__set方法的设置noway的值为899 $a->Get(); echo ''; // 设置对象不存在的属性spaceman $a->spaceman = 566; // 经过__set方法的设置noway的值为566 $a->Get(); */ __sleep():serialize之前被调用,(使用serialize时,就会调用__sleep)可以指定要序列化的对象属性。class Test{ public $name; public $age; public $string; // __construct:实例化对象时被调用.其作用是拿来初始化一些值。 public function __construct($name, $age, $string){ echo "__construct 初始化".""; $this->name = $name; $this->age = $age; $this->string = $string; } // __sleep() :serialize之前被调用,可以指定要序列化的对象属性 public function __sleep(){ echo "当在类外部使用serialize()时会调用这里的__sleep()方法"; // 例如指定只需要 name 和 age 进行序列化,必须返回一个数值 return array('name', 'age'); } } $a = new Test("Spaceman",566, 'Test String'); echo serialize($a); */ __wakeup:反序列化恢复对象之前调用该方法(使用unserialize()方法时)class Test{ public $sex; public $name; public $age; public function __construct($name, $age, $sex){ $this->name = $name; $this->age = $age; $this->sex = $sex; } public function __wakeup(){ echo "当在类外部使用unserialize()时会调用这里的__wakeup()方法"; $this->age = 566; } } $person = new Test('spaceman',21,'男'); $a = serialize($person); echo $a.""; var_dump (unserialize($a)); */ __isset(): 检测对象的某个属性是否存在时执行此函数。 当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用class Person{ public $sex; private $name; private $age; public function __construct($name, $age, $sex){ $this->name = $name; $this->age = $age; $this->sex = $sex; } // __isset():当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。 public function __isset($content){ echo "当在类外部使用isset()函数测定私有成员 {$content} 时,自动调用"; return isset($this->$content); } } $person = new Person("spaceman", 25,'男'); // public 成员 echo ($person->sex),""; // private 成员 echo isset($person->name); */ __unset():在不可访问的属性(private)上使用unset()时触发 销毁对象的某个属性时执行此函数class Person{ public $sex; private $name; private $age; public function __construct($name, $age, $sex){ $this->name = $name; $this->age = $age; $this->sex = $sex; } // __unset():销毁对象的某个属性时执行此函数 public function __unset($content) { echo "当在类外部使用unset()函数来删除私有成员时自动调用的"; echo isset($this->$content).""; } } $person = new Person("spaceman", 21,"男"); // 初始赋值 echo "666666"; unset($person->name);//调用 属性私有 unset($person->age);//调用 属性私有 unset($person->sex);//不调用 属性共有,不会执行__unset函数 */ __INVOKE():将对象当做函数来使用时执行此方法,通常不推荐这样做。class Test{ // _invoke():以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用 public function __invoke($param1, $param2, $param3) { echo "这是一个对象"; var_dump($param1,$param2,$param3); } } $a = new Test(); $a('spaceman',21,'男'); //a为对象,将a当做了方法 */ ?> #方法&属性-调用详解&变量数据详解 对象变量属性: public(公共的):在本类内部、外部类、子类都可以访问 protect(受保护的):只有本类或子类或父类中可以访问 private(私人的):只有本类内部可以使用 序列化数据显示: private属性序列化的时候格式是%00类名%00成员名 protect属性序列化的时候格式是%00*%00成员名 具体代码: -输出对象可调用__toString -无代码通过原生类Exception -Exception使用查询编写利用 -通过访问触发输出产生XSS漏洞 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |