序列化和克隆
1、代码练习
<?php
namespace T1;
class A
{
public $name='ldy';
protected $age=30;
private $sex='man';
public function getname(){
echo $this->name;
}
}
$a=new A();
echo "<h5>序列化对象</h5>",'<br>';
$s=serialize($a);
echo $s;
echo "<h5>反序列化对象</h5>",'<br>';
$A=unserialize($s);
var_dump($A);echo'<br>';
echo '反序列化后获取类名:'.get_class($A),'<br>';
echo '<hr>';
namespace T2;
echo '<h3>自定义序列化和反序列</h3>';
class A
{
public $name='ldy';
protected $age=30;
private $sex='man';
public function getname(){
echo $this->name;
}
public function __sleep(){
//序列化时执行,序列化对象属性
return ['name','sex'];
}
public function __wakeup()
{ //反序列化时执行
return $this->getname();
}
}
$a=new A();
echo "<h5>序列化对象</h5>",'<br>';
$s=serialize($a);//序列化时,
echo $s;
echo "<h5>反序列化对象</h5>",'<br>';
$A=unserialize($s);//反序列化类自动执行__wakeup(){};
echo '<br>';
var_dump($A);echo'<br>';
echo '<hr>',"<h5>对象复制=和clone</h5>",'<br>';
$name=new A();
$c=$name;//引用又称别名
$c->name='dacheng';
echo '$c中name的值:'.$c->name,'<br>';
echo '$name中name的值:'.$name->name,'<br>';
$name=new A();
$c=clone $name;//克隆一个新的类实例
$c->name='dacheng';
echo '$c中name的值:'.$c->name,'<br>';
echo '$name中name的值'.$name->name,'<br>';
2、演示结果
魔术方法__toString():自定义登陆异常类
1、代码
<?php
class MyException extends Exception
{
public function __construct($message,$code){
$this->message=$message;
$this->code=$code;
}
public function __toString(){
$str="异常错误提示:{$this->message}".'<br>'."异常提示代码:{$this->code}";
return $str;
}
}
class Login
{
public static $code;
public function __construct($code){
self::$code=$code;
switch(self::$code){
case 1:
throw new MyException('密码错误',1);
break;
case 2:
throw new MyException('账户错误',2);
break;
default:
throw new MyException('未知异常',3);
}
}
}
try{
$error=new Login(2);
}catch(MyException $e){
echo $e;
}
2、运行结果
总结
1、序列化:serialize()
;对象序列化对应的函数:__sleep(){}
2、发序列化:unserialize()
;对象反序列化(是生成一个新对象)的对应的函数:__wakeup(){}
3、对象的复制:clone
关键字,对应的对象函数__clone(){}
;=
把对象赋值给一个变量,是引用,就是别名
4、__toString(){}
魔术方法:在直接输出对象时,自动调用
5、匿名类:new class{}
:在接口实现部分功能和作为函数参数时使用