- 基础知识:
1.php类与对象
2.魔术函数
3.序列化方法
- 类与对象
<?php class test{ public $var = "hello world"; public function echop() { echo $this->var; } } $obj = new test(); $obj->echop(); ?>
OutPut:
helloworld
首先要创建一个对象的实例,然后调用它。
- 2.魔术函数
__construct(),__destruct(),__call(),__callStatic(),__get(),__set(),__isset(),__unset(),__sleep(),__wakeup(),__toString(),__invoke(),
__construst() 方法在每次创建新对象时会被自动调用
__destruct() 方法在使用exit()终止脚本运行时也会被自动调用
__toString() 方法在一个类被当成字符串被调用‘
<?php class test{ public $var = "hello world"; public function echop() { echo $this->var; echo "<br />"; } public function __construct() { echo "construct"; echo "<br />"; } public function __destruct() { echo "destruct";// TODO: Implement __destruct() method. echo "<br />"; } public function __toString() { return "toString";// TODO: Implement __toString() method. echo "<br />"; } } $obj = new test(); $obj->echop(); echo $obj; ?>
output:
construct
hello world
toStringdestruct
因此观察他们的输出顺序就可以知道这些函数的特性。
- 序列化
serialize($var)
序列化的过程就是将一个对象用字符串进行储存。
这些是一些基础知识。强网杯有一道题利用的就是反序列化的一些原理,可以看一下:
upload:
之前的登陆注册不细说了。这里主要看一下出现序列化的代码。
这里将profile在类中进行反序列化处理
在tp5中还存在一些断点,查看这些断点的位置。
<?php namespace appwebcontroller; class Profile { public $checker; public $filename_tmp; public $filename; public $upload_menu; public $ext; public $img; public $except; public function __get($name) { return $this->except[$name]; } public function __call($name, $arguments) { if($this->{$name}){ $this->{$this->{$name}}($arguments); } } } class Register { public $checker; public $registed; public function __destruct() { if(!$this->registed){ $this->checker->index(); } } } $profile = new Profile(); $profile->except = ['index' => 'img']; $profile->img = "upload_img"; $profile->ext = "png"; $profile->filename_tmp = "../public/upload/da5703ef349c8b4ca65880a05514ff89/e6e9c48368752b260914a910be904257.png"; $profile->filename = "../public/upload/da5703ef349c8b4ca65880a05514ff89/e6e9c48368752b260914a910be904257.php"; $register = new Register(); $register->registed = false; $register->checker = $profile; echo urlencode(base64_encode(serialize($register)));
这里记录这道题的目的是介绍一下这些魔法函数在不同框架中发挥的作用。例如这里,为什么要引进这些魔术函数。这里的construct是验证这里的用户是否注册了账号,如果没注册就返回index.php
_get()和_call()是给出了再调用了不可调用的成员或方法时的处理方法。
-
序列化public private protect参数产生不同结果
<?php class test{ private $test1 = "hello"; public $test2 = "hello"; protected $test3 = "hello"; } $test = new test(); echo serialize($test); ?>
公有类,私有类,保护类。
输出之后
O:4:"test":3:{s:11:"testtest1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"*test3";s:5:"hello";}
网页抓取后得到:
O:4:"test":3:{s:11:"