Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:是的, 如果不知有这几个魔术方法, 又得自己写一大堆代码去处理
serialize();
序列化:就是把不能直接存储的数据转换成可存储的数据。unserialize();
反序列化: 就是把序列化的数据,转换成我们需要的格式__sleep()
: 魔术方法,当序列化一个对象的时候自动调用__wakeup()
: 魔术方法,当反序列化的时候自动调用__clone()
:当克隆对象的时候自动调用
演示代码:
<?php
// __sleep():当序列化一个对象的时候自动调用
// __wackup():当反序列化的时候自动调用
// __clone():当克隆对象的时候自动调用
abstract class aBo
{
public $name = '佴总';
public $salary = 20000;
}
class Con extends aBo
{
public $sex = '男';
protected $age = 38;
private $isMarried = false;
protected static $nationality = '中国/CHINA';
public function __get($name)
{
return $this->$name;
}
public function __sleep(): array
{
return ['name', 'sex', 'isMarried'];
}
public function __wakeup()
{
$this->name = '尹总';
$this->age = 41;
$this->sex = '保密';
}
public function __clone()
{
$this->salary = 0;
}
}
$con = new Con();
echo serialize($con);
echo '<hr>';
$str = serialize($con);
var_dump(unserialize($str));
echo '<hr>';
//clone 克隆出新对象
$con1 = clone $con;
echo $con1->name, '----', $con1->salary;
效果图:
__toString()
:把对象当成字符串打印的时候调用
演示代码:
<?php
use Exception;
class MyException extends Exception
{
public function __toString()
{
return <<<HEREDOC
<style>
table {border-collapse: collapse;border:1px solid black;text-align: center;}
td {border:1px solid black;padding: 5px;}
tr:first-of-type {background-color:#eee;}
tr:last-of-type td {color: coral;}
</style>
<table>
<caption>异常信息</caption>
<tr>
<th>内容</th>
<th>异常代码</th>
<th>行号</th>
</tr>
<tr>
<td>$this->message</td>
<td>$this->code</td>
<td>$this->line</td>
</tr>
</table>
HEREDOC;
}
}
try {
if(true)throw new MyException('用户名错误', 404);
}catch (MyException $a) {
echo $a;
}
效果图:
匿名类: 只用一次,声明, 实例化,成员访问三合一
演示代码:
<?php
// 匿名类
// 这个类只用一次, 将类的声明, 类的实例化,成员访问三合一
echo (new class
{
public function get($name)
{
return '姓名: ' . $name;
}
})->get('马总') , '<hr>';
// 应用场景: 实现接口部分功能, 仅用在当前项目中
interface iDb
{
public function __construct(...$params);
}
$res = (new class ('mysql:host=localhost;dbname=phpedu', 'root', 'root') implements iDb {
private $db = null;
public function __construct(...$params)
{
$this->db = new PDO($params[0],$params[1],$params[2]);
}
public function select()
{
return $this->db
->query('SELECT id,name,position FROM staffs ' .' LIMIT 4')
->fetchAll(PDO::FETCH_ASSOC);
}
}
)->select();
printf('<pre>%s</pre>', print_r($res, true));
效果图:
__sleep()``__wakeup()``__clone()
这三个魔术方法之前忽略了的感觉,还是很的用的。