php接口和异常处理

来源:互联网 发布:取消数据库紧急模式 编辑:程序博客网 时间:2024/06/05 09:50

接着昨天的部分,php面向对象也提供了接口这个东西,单从接口这一块来说php和java基本上没区别,不论java还是php接口从一定程度上弥补了类单继承的不足,在不破坏类层级关系的前提下减小了耦合度.废话不说了来看一下java和php的相同点和不同点吧

1.php的接口里面不允许出现静态变量但是可以有常量,php的类内部常量用const来声明,java里允许有静态常量

2.java可以使用final来声明一个常量,但是php使用的是const

下面这些地方java和php一致

3.如果类用final修饰则该类不能被继承,如果用来声明方法表示方法不能被重写

4.php的类也可以同时继承一个类,并实现多个接口;同样的接口也可以继承接口

差不多也就这些,下面来继续研究php的错误处理和异常处理

说句真心话php的错误和异常处理真不怎地,比起java来简直就是弱爆了,个人感觉php的这一块还不成熟

一   php的错误处理

(1) 使用die()来处理,就像下面这样

<?php  function main(){    if(!file_exists("01.txt")){      die("文件不存在");    }else{      $f=fopen("01.txt","r");      fclose($f);    }  }  main();?>

当然还有其他的写法,大家自己去写就好。

(2)顶层错误处理器

这种方式一般就是用于改写php的错误处理机制,就是说我们自己可以自己定义一个function,之后使用set_error_handler("自己的处理器",错误级别),这里一般不要使用E_USER的这种错误级别

(3)错误触发器,这种情况一般用于自定义的错误

定义和用法

trigger_error() 函数创建用户定义的错误消息。

trigger_error() 用于在用户指定的条件下触发一个错误消息。它与内建的错误处理器一同使用,也可以与由 set_error_handler() 函数创建的用户自定义函数使用。同样的set_error_handler()也有2个参数第一个是处理器名称,第二个是级别,这里级别有这么几种

  • E_USER_ERROR
  • E_USER_WARNING
  • E_USER_NOTICE
但是有时为了项目运维的方便,还需要记录错误日志,语法如下

error_log(error,type,destination,headers)
error就是错误信息,一般是字符串,类型有这么几种

  • 0 - 默认。根据在 php.ini 文件中的 error_log 配置,错误被发送到服务器日志系统或文件。
  • 1 - 错误被发送到 destination 参数中的地址。只有该类型使用 headers 参数。
  • 2 - 通过 PHP debugging 连接来发送错误。该选项只在 PHP 3 中可用。
  • 3 - 错误发送到文件目标字符串。
一般情况就使用3这种,第三个参数就是错误日志的位置可以是网络地址或是磁盘路径,错误处理差不多就这些


二  异常处理

php里这一块和java差别有点大,最重要的一点就是php里的try...catch后面不能有finally,语法如下

try{

}catch(Exception $e){

  echo  $e.getMessage();

}

php也像java可以声明异常,代码大致如下

<?php//create function with an exceptionfunction checkNum($number) { if($number>1)  {  throw new Exception("Value must be 1 or below");  } return true; }//trigger exceptioncheckNum(2);?>


异常的机制大致和java类似,如果声明了异常但是调用的地方没有捕获,异常也不会出现,php也可以自定义异常如下所示


<?phpclass customException extends Exception { public function errorMessage()  {  //error message  $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()  .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';  return $errorMsg;  } }$email = "someone@example...com";try { //check if  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)  {  //throw exception if email is not valid  throw new customException($email);  } }catch (customException $e) { //display custom message echo $e->errorMessage(); }?>

还有一种就是异常顶级处理器set_exception_handler,用法类似这种

<?php    set_exception_handler( 'exc_handler' );    function exc_handler($exception) {        echo "Uncaught exception: " , $exception->getMessage(), "\n";    }    function errorone() {        throw new Exception("Test 1");    }    function errortwo() {        throw new Exception("Test 2");    }    function test() {        errorone();        errortwo();    }    test();    test();?>

有一些情况php无法捕获到异常,例如5/0原因是php没有声明这些异常,算是php的缺陷吧。综合php,java,asp.net来看java异常处理做的还是比较出色的。


原创粉丝点击