本文目录
一、序列化与反序列化
1.1 数组的序列化与反序列化
在PHP中,数组和对象无法保存,如果需要保存就要将数组或对象转换成一个序列。
序列化:将数组或对象转换成一个序列(serialize)
反序列化:将序列化的字符串转换成数组或对象。(unserialize)
vv
序列化:
<?php
$stu=['tom', 'berry', 'ketty'];
// echo $stu=serialize($stu); // 序列化
$str=serialize($stu); // 序列化
file_put_contents('./stu.txt', $str);
?>
效果:
反序列化:
<?php
/*
$stu=['tom', 'berry', 'ketty'];
// echo $stu=serialize($stu); // 序列化
$str=serialize($stu); // 序列化
file_put_contents('./stu.txt', $str);
*/
// 数组的反序列化
$str=file_get_contents('./stu.txt');
$stu=unserialize($str);
print_r($stu);
?>
效果:
1.2 对象的序列化与反序列化
<?php
class Student {
public $name;
protected $sex;
private $add;
public function __construct($name, $sex, $add) {
$this->name=$name;
$this->sex=$sex;
$this->add=$add;
}
}
// 测试
$stu=new Student('tom', '男', '北京');
// 序列化
$str=serialize($stu);
file_put_contents('./stu.txt', $str);
?>
效果:
对象反序列化(序列化反编译的时候需要类的参与):
<?php
class Student {
public $name;
protected $sex;
private $add;
public function __construct($name, $sex, $add) {
$this->name=$name;
$this->sex=$sex;
$this->add=$add;
}
}
// 测试
$stu=new Student('tom', '男', '北京');
// 序列化
$str=serialize($stu);
file_put_contents('./stu.txt', $str);
// 反序列化
$str=file_get_contents('./stu.txt');
$stu=unserialize($str);
var_dump($stu);
?>
效果:
二、魔术方法
已学魔术方法:
__construct()、 __destruct()、 __clone()
。
2.1 __tostring()
<?php
class Student {
// 把对象当成字符串使用的时候自动执行
public function __tostring() {
return '我是对象<br/>';
}
}
$stu=new Student;
echo $stu;
?>
效果:
2.2 __invoke()
<?php
class Student {
// 把对象当成字符串使用的时候自动执行
public function __tostring() {
return '我是对象<br/>';
}
// 把对象当成函数使用的时候自动自行
public function __invoke() {
echo '这是一个对象,不是函数';
}
}
$stu=new Student;
$stu();
?>
效果:
2.3 __set()、__get()、
__set($k, $v)
: 给无法访问的属性赋值的时候自动执行。
__get($k)
:获取无法访问的属性值的时候自动调用。
例:
<?php
class Student {
private $name;
private $sex;
private $age;
// 给无法访问的属性赋值的时候自动执行
public function __set($k, $v) {
$this->$k=$v;
}
// 给无法访问的属性赋值的时候自动执行
public function __get($k) {
return $this->$k;
}
}
$stu=new Student;
$stu->name='tom';
$stu->sex='男';
$stu->age='18';
echo $stu->name;
?>
效果:
2.4 __isset()、__unset()
__isset()
:判断无法访问的属性是否存在。
__unset()
:销除无法访问的属性的时候。
例:
<?php
class Student {
private $name;
private $sex;
private $age;
// 给无法访问的属性赋值的时候自动执行
public function __set($k, $v) {
$this->$k=$v;
}
// 给无法访问的属性赋值的时候自动执行
public function __get($k) {
return $this->$k;
}
// 判断无法访问的属性是否存在
public function __isset($k) {
return isset($this->$k);
}
// 消除无法访问的属性
public function __unset($k) {
unset($this->$k);
}
}
$stu=new Student;
$stu->name='tom';
$stu->sex='男';
$stu->age='18';
// echo $stu->name;
var_dump(isset($stu->name));
unset($stu->age);
print_r($stu);
?>
效果:
应用:
<?php
class Student {
private $name; // 读写属性
private $add='中国'; // 只读属性
private $age; // 只写属性
public function __set($k, $v) {
if (in_array($k, array('name', 'age'))) {
$this->$k=$v;
}
else {
echo "${k}属性是只读属性<br/>";
}
}
public function __get($k) {
if (in_array($k, array('name', 'add'))) {
return $this->$k;
}
else {
echo "{$k}是只写属性<br/>";
}
}
}
// 测试
$stu=new Student;
$stu->name='tom';
$stu->age=22;
echo '姓名:'.$stu->name,'<br/>';
echo '地址:'.$stu->add,'<br/>';
echo $stu->age;
?>
效果:
2.5 __call()、__callstatic()
__call()
:调用无法访问方法时自动执行
__callstatic()
:调用无法访问的静态方法时自动执行
例:
<?php
class Student {
/**
* 作用:调用无法访问的方法时自动执行
* @param $fn_name string 方法名
* @param $fn_args array 参数数组
*/
public function __call($fn_name, $fn_args) {
echo "{$fn_name}不存在<br/>";
}
// 调用无法访问的静态方法时自动执行
public static function __callstatic($fn_name, $fn_args) {
echo "{$fn_name}静态方法不存在";
}
}
$stu=new Student;
$stu->show(10,20);
// 静态调用
Student::show();
?>
效果:
2.6 __sleep()、__wakeup()
__sleep()
:当序列化的时候自动调用
__wakeup()
:当反序列化的时候自动调用
例:
<?php
class Student {
private $name;
private $sex;
private $add='中国';
public function __construct($name, $sex) {
$this->name=$name;
$this->sex=$sex;
}
/**
* 序列化的时候自动调用
* @return array 序列化字段名
*/
public function __sleep() {
return array('name', 'sex');
}
/**
* 反序列化的自动调用
*
*/
public function __wakeup() {
$this->type='学生';
}
}
// 测试
$stu=new Student('tom', '男');
$str=serialize($stu);
$stu=unserialize($str);
// echo $str;
print_r($stu);
?>
效果:
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。