批改状态:合格
老师批语:是的, 如果不知有这几个魔术方法, 又得自己写一大堆代码去处理
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():把对象当成字符串打印的时候调用
演示代码:
<?phpuse 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()这三个魔术方法之前忽略了的感觉,还是很的用的。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号