php异常类与sleep(),wakeup()
php异常处理
异常处理通常用在指定的错误(异常)情况发生时改变脚本的正常流程,这种情况称为异常。
当异常被触发时,代码执行被切换到预定义的异常处理器函数
这里演示一个模拟用户登录与验证的案例:
class nameException extends Exception
{
public function errorMessage()
{
echo '账号或密码不对';
}
}
// 验证不对时调用这个类
class passException extends Exception
{
public function testMessage()
{
echo '验证错误';
}
}
$name = 12;
$password = 123;
$test = 12;
// 使用异常的函数应该位于`try`代码块内,如果没有触发异常,则正常执行,如果出现错误,则抛出一个异常
try{
// 当账号不对时,抛出一个异常
if($name != 123 || $password != 123):
throw new nameException();
// 当验证码不对时,抛出一个异常
elseif ($test != 123):
throw new passException();
// 当它们都不对时,调用顶级异常类
else:
throw new Exception('当前用户不存在!');
endif;
}
// 通常一个`throw`必须对于至少一个`catch`
catch(nameException $e)
{
echo $e->errorMessage();
}
catch(passException $e)
{
echo $e->testMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
输出账号或密码不对
sleep()与wakeup()
__sleep()
与__wakeup()
是魔术方法的一种。
_sleep()
触发事件:对象被序列化之前
作用:返回需要序列化存储的成员属性,删减不必要
返回:array需要被序列化存储的成员属性数组
__wakeup()
触发事件:类的实例的序列化串被序列化时
作用:预先准备对象资源
返回:void
示例:
class Connection
{
protected $link;
private $params = [];
// 构造方法
public function _construct($dsn,$username,$password)
{
$this->params['dsn'] = $dsn;
$this->params['username'] = $username;
$this->params['password'] = $password;
$this->connect();
}
public function connect()
{
$this -> link = new PDO(...array_values($this->params));
}
// 序列化时自动重新链接
public function __sleep()
{
return ['params'];
}
// 反序列化时自动重新链接
public function __wakeup()
{
$this->connect();
}
// 测试
public function select($sql)
{
return $this->link->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
}
// 客户端
$db = new Connection('mysql:host=localhost;dbname=message','1','123456');
print_r($db->select('select * from message limit3'));
echo '<hr>';
$str = serialize($db);
echo $str.'<br>';
// 反序列化,会重新返回一个新对象,所以要重新链接才能查询
$obj = unserialize($str);
print_r($obj->select('select * from message limit 3'));
总结
对脚本的异常处理有了基本认识,知道如何自定义一个异常类,调用自定义方法,对代码调试时,又知道了一种方法,不再靠基本的echo
,var_dump
,print
打印错误,异常处理的好处能进行大量的代码块处理。__sleep
和__wakeup
都用在对象的序列化操作。