1 __sleep()、__wakeup()
魔术方法
__sleep():当序列化的时候自动调用
__wakeup():当反序列化的时候自动调用
示例:
<?php
class Demo {
private $name;
private $sex;
private $msg='PHP中文网11期';
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='学员';
}
}
//测试
$demo=new Demo('许先生','男');
$str=serialize($demo); //序列化
$demo=unserialize($str); //反序列化
$res=print_r($demo,true);
printf('<pre>%s</pre>',$res);
2 异常处理
集中处理在代码块中发生的异常。
在代码块中发生了异常直接抛出,代码块中不处理异常,将异常集中起来一起处理。
2.1 使用的关键字
try:监测代码块
catch:捕获异常
throw:抛出异常
finally:无论有无异常都会执行,可以省略
Exception:异常类
语法结构
try{
//检测代码
}catch(Exception $ex){
//捕获异常
}
finally{
//不论是否有异常,都要执行,finally可以省略
}
示例:
<?php
if (isset($_POST['button'])) {
try {
$username = $_POST['username'];
if ($username == '')
throw new Exception('用户名不能为空', 1024); //抛出异常
if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $username))
throw new Exception('用户名不能为中文', 1025); //抛出异常
if (!preg_match("/^[^\d\-.,:]/", $username))
throw new Exception('用户名不能以数字和特殊字符开头', 1026); //抛出异常
if (!(strlen($username) >= 3 && strlen($username) <= 12))
throw new Exception('用户名长度只能值3-12之间', 1027); //抛出异常
echo'提交成功您的用户名为', "{$username}", '<br>';
} catch (Exception $ex) { //捕获异常
echo '错误信息:' . $ex->getMessage(), '<br>';
echo '错误码:' . $ex->getCode(), '<br>';
echo '文件地址:' . $ex->getFile(), '<br>';
echo '错误行号:' . $ex->getLine(), '<br>';
} finally {
echo '关闭数据库连接'; //不管是否有异常,finally都要执行
}
}
?>
<form method="post" action="">
用户名: <input type="text" name="username" value="<?=@$username ?>"> <br />
<input type="submit" name="button" value="提交">
</form>
效果图:
2.2 自定义异常
场景:如果实现异常的分类处理?比如异常有三个级别异常对应三种处理方式
自定义三种异常即可
所有异常类的父类是Exception,Exception中的方法不允许重写
<?php
//自定义空异常类
class MyNullException extends Exception {
}
//自定义类型异常
class MyTypeException extends Exception {
}
//自定义范围异常
class MyRangeException extends Exception {
}
//逻辑代码
if(isset($_POST['button'])) {
try{
$username = $_POST['username'];
if ($username == '')
throw new MyNullException('用户名不能为空', 1024); //抛出异常
if (preg_match('/[\x{4e00}-\x{9fa5}]/u', $username))
throw new MyTypeException('用户名不能为中文', 1025); //抛出异常
if (!preg_match("/^[^\d\-.,:]/", $username))
throw new MyTypeException('用户名不能以数字和特殊字符开头', 1026); //抛出异常
if (!(strlen($username) >= 3 && strlen($username) <= 12))
throw new MyRangeException('用户名长度只能值3-12之间', 1027); //抛出异常
echo'提交成功您的用户名为', "{$username}", '<br>';
}catch(MyNullException $ex){
echo $ex->getMessage(),'<br>';
echo '错误记录在日志中';
}catch(MyTypeException $ex){
echo $ex->getMessage(),'<br>';
echo '发送电子邮件';
}catch(MyRangeException $ex){
echo $ex->getMessage(),'<br>';
echo '给管理员打电话';
}
}
?>
<form method="post" action="">
用户名: <input type="text" name="username" value="<?=@$username ?>"> <br />
<input type="submit" name="button" value="提交">
</form>