知识屋:更实用的电脑技术知识网站
所在位置:首页 > 编程技术 > PHP编程

[PHP]将“变量”转换为”可以引入的文件“以及 异常的使用

发布时间:2014-09-05 10:44:42作者:知识屋

槽吐吐,最近在看一本叫《代码简洁之道》的书,书中讲了如何让自己的代码变得容易读懂,受益匪浅。有兴趣的朋友可以看看。

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;
    }
}

 

(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜