php接口和异常处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenwill3/article/details/10307019

接着昨天的部分,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 exception
function checkNum($number)
 {
 if($number>1)
  {
  throw new Exception("Value must be 1 or below");
  }
 return true;
 }

//trigger exception
checkNum(2);
?>


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


<?php
class 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异常处理做的还是比较出色的。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页