2015-05-27
槽吐吐,最近在看一本叫《代码简洁之道》的书,书中讲了如何让自己的代码变得容易读懂,受益匪浅。有兴趣的朋友可以看看。
PHPer很少使用异常,即时是公司里的大牛,也不见得会使用异常。更多情况下,异常仅仅被当作error code的另外一个实现体而已。我记得我在前面的博客里还说到过异常,貌似木有人支持啊。
想象一下:一个代码里出现了如下情况:
[php]
<?php
if(($retCode = fun1()) == 0){
$html = "Hello,world";
if(($retCode = fun2()) == 0){
if(($retCode = fun3()) == 0){
}else{
//出错了
}
}else{
//出错了
}
}else{
//出错了
}
<?php
if(($retCode = fun1()) == 0){
$html = "Hello,world";
if(($retCode = fun2()) == 0){
if(($retCode = fun3()) == 0){
}else{
//出错了
}
}else{
//出错了
}
}else{
//出错了
}
上面的代码,熟悉么?之前看discuz的源码时,有一段代码有类似的结构,这样写,代价确实很大,尤其是后面的人来读这段代码的时候。我们确实没有重构的习惯,使用异常重构,可以很好解决这个问题
[php]
<?php
try{
fun1();
fun2();
fun3();
}catch(Exception_FUNC_1 $e){
//错误处理
}catch(Exception_FUNC_2 $e){
//错误处理
}catch(Exception_FUNC_3 $e){
//错误处理
}
<?php
try{
fun1();
fun2();
fun3();
}catch(Exception_FUNC_1 $e){
//错误处理
}catch(Exception_FUNC_2 $e){
//错误处理
}catch(Exception_FUNC_3 $e){
//错误处理
}
是不是好点?还可以再优化么?
[php]
<?php
try{
fun1();
fun2();
fun3();
}catch(Exception $e){
echo $e->getMessage();
}
function fun1(){
throw new Exception("Your input is empty", 10001);
}
<?php
try{
fun1();
fun2();
fun3();
}catch(Exception $e){
echo $e->getMessage();
}
function fun1(){
throw new Exception("Your input is empty", 10001);
}
好处是什么?
1. 你可以专注与正常的流程,而不用关心出错了会怎么办
2. 将错误的部分统一处理,返回错误、日志、回溯
3. 随意增加错误类型,因为本身是自定义,你不用维护一套error code
4. 代码结构清晰,维护代价低
5. 特有的类维护自己的异常,如:smarty、phpunit,出错了有自己的记录方式,与所处的系统无耦合
看个人习惯,我个人极力推荐
有这么一个需求:
我想将一个变量(可能为数组、字符串、数字),可以输出到文件里,使这个文件被别的php文件include后,使用这个变量,即:
[php]
<?php
$a = array(
0 => 'abc',
1 => array(
'abc' => '2345'
)
);
//输出到文件的内容是:
{
return array(
0 => 'abc',
1 => array(
'abc' => '2345'
)
);
}
<?php
$a = array(
0 => 'abc',
1 => array(
'abc' => '2345'
)
);
//输出到文件的内容是:
{
return array(
0 => 'abc',
1 => array(
'abc' => '2345'
)
);
}
然后,下一个文件include后是:
[php]
$a = include("file.php");
$a = include("file.php");
它就拥有了这个数据了。
具体什么场合下用到,我们将内存中的数据放到硬盘中,除了serialize外,这也是一种方便的做法,因为不需要unserialize。不好的一点是:没法对对象、句柄做操作。
我是这么写的:
[php]
<?php
class Code
{
/**
* 将变量转化为字符串
*
* @param mixed $var 仅包含字符串、数字、数组的变量
* @param string $pfx 前缀,输出的内容容易被读
*
* @return string
*/
public function var2Str($var, $pfx = ''){
$str = '';
if(is_array($var)){
$str = "array(/n";
$pfx .= "/t";
foreach($var as $k => $v){
if(is_string($k)){
$k = "/"{$k}/"";
}
$str .= $pfx . "{$k} => " . $this->var2Str($v, $pfx) . ",/n";
}
$str .= $pfx . ")";
}elseif(is_int($var) || is_float($var)){
$str = "{$var}";
}elseif(is_string($var)){
$str = "/"{$var}/"";
}
return $str;
}
}
<?php
class Code
{
/**
* 将变量转化为字符串
*
* @param mixed $var 仅包含字符串、数字、数组的变量
* @param string $pfx 前缀,输出的内容容易被读
*
* @return string
*/
public function var2Str($var, $pfx = ''){
$str = '';
if(is_array($var)){
$str = "array(/n";
$pfx .= "/t";
foreach($var as $k => $v){
if(is_string($k)){
$k = "/"{$k}/"";
}
$str .= $pfx . "{$k} => " . $this->var2Str($v, $pfx) . ",/n";
}
$str .= $pfx . ")";
}elseif(is_int($var) || is_float($var)){
$str = "{$var}";
}elseif(is_string($var)){
$str = "/"{$var}/"";
}
return $str;
}
}
1
CI框架连接数据库配置操作以及多数据库操作
09-05
2
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
05-17
3
C语言关键字及其解释介绍 C语言32个关键字详解
04-05
4
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
04-26
5
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
09-05
6
将视频设置为Android手机开机动画的教程
12-11
7
PHP中的(++i)前缀自增 和 (i++)后缀自增
09-05
8
常用dos命令及语法
09-27
PHP中include和require区别之我见
2014-09-05
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
2017-04-12
php递归返回值的问题
2014-09-05
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
单片机编程好学吗?单片机初学者怎样看懂代码
2022-03-21
PHP 教程之如何使用BLOB存取图片信息实例
2014-09-05
零基础的初学者怎样学习java,或者应该先学什么?
2022-03-21
学ug编程如何快速入门?
2022-03-17
PHP数组函数array
2014-09-05
学习使用C语言/C++编程的7个步骤!超赞~
2022-03-20
球球大作战汉化版下载v19.7.1 安卓版
其它手游 170.54MB
下载
葫芦侠三楼最新破解版下载v4.4.0.6 安卓版
其它手游 34.82MB
下载
葫芦侠7楼破解版免费下载v4.4.0.6安卓最新版
其它手游 34.82MB
下载
葫芦侠八楼免费版下载v4.4.0.6安卓版
其它手游 34.82MB
下载
葫芦侠3楼破解版免费下载v4.4.0.6安卓手机版
其它手游 34.82MB
下载
像素漫斗抱歉,“八神庵”是特指游戏角色的专有名词,不存在符合要求的常用同义词近义词。下载v1.00安卓版
其它手游 206.87MB
下载
葫芦侠4楼破解版游戏修改器下载v4.4.0.6安卓免费版
其它手游 34.82MB
下载
末日餐厅安卓版下载v1.35安卓版
其它手游 73.98MB
下载葫芦侠十楼免费破解版下载v4.4.0.6安卓版
下载
葫芦侠8楼最新破解版下载v4.4.0.6安卓版
下载
猫娘乐园世界连结正版下载v1.9.1 安卓版
下载
像素漫斗全员下载v1.00安卓版
下载
葫芦侠8楼手机版下载v4.4.0.6安卓版
下载
末日餐厅正版官网入口下载v1.35安卓版
下载
我的汉克狗正版下载v26.4.1.48473 安卓版
下载
像素漫斗u鼬神最新版本下载v1.00安卓版
下载