服务端 - PHP - OOP之对象序列化和对象复制、异常处理和匿名类
一、对象序列化和对象复制
1. 对象序列化
- 解释:将对象转换成可以存储的字节流
- 序列化:serialize()
- 反序列化:unserialize()
//定义一个工作类
class Person {
//初始化赋值
public function __construct(...$args)
{
list($name, $sex, $age) = $args;
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
//当类实例被序列化时
public function __sleep()
{
return ['name', 'sex', 'age'];
}
//当对象字符串被反序列化时
public function __wakeup()
{
$this->name = '小红';
$this->sex = '女';
$this->age = 17;
}
}
//客户端代码
$p1 = new Person('小明', '男', 18);
echo serialize($p1);
$str = serialize($p1);
echo '<br>';
var_dump(unserialize($str));
2. 对象复制
//定义一个工作类
class Person {
public $name = '小明';
public $sex = '男';
public $age = 18;
}
//客户端代码
$p1 = new Person;
$p2 = $p1;
$p2->name = '小红';
echo $p1->name;
$p3 = clone $p1;
$p3->age = 17;
echo $p1->age;
二、异常处理
- 处理语句:try{//可能会出现异常的代码 throw//如何触发异常或抛出异常}catch{//捕获并接收异常,并输出来自该异常的错误信息}
- 自定义异常类:继承自Exception类
//自定义一个异常类
class SelfException extends Exception {
public function errMess()
{
$errmsg = '过滤失败:含有非法字符';
return $errmsg;
}
}
//定义一个样本
$email = "小明@php.cn";
//处理异常
try {
if (filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//触发/抛出异常
throw new SelfException($email);
}
} catch (SelfException $e) {
//捕获/接受异常
echo $e->errMess();
}
三、匿名类
- 语法:(new class)/(new class(){代码})
- 特点:1.将实例化与成员访问二合一; 2. 将类,类的实例化,成员访问三合一
- 作用:该类实例仅被使用一次
1. 实现接口部分功能, 仅用在当前项目中
//定义一个接口
interface iPerson {
public function __construct(...$args);
}
//定义一个匿名类
$name = (new class('小明', '男', 18) implements iPerson {
public function __construct(...$args) {
list($name, $sex, $age) = $args;
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public function getName() {
return $this->name;
}
})->getName();
//客户端代码
echo $name;
2. 用在函数/方法的参数中
//定义一个函数
function getName(object $p1, string $name) {
return $p1->setName($name);
}
//客户端代码
echo getName(new class(){
public function setName($name) {
return $name;
}
},'小明');
四、课程总结
- 今天学习了 PHP 的面向对象编程,通过上课认真听讲和认真完成老师布置的作业,使得我对 PHP 面向对象编程的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了对象序列化和对象复制、异常类和匿名类的特点以及它们的基本用法。