PHP 7 详解
  • 介绍
  • PHP 7 安装
  • PHP 7.0.x 新特性
    • OOP 特性
      • 类型声明
      • 命名空间与use关键词批量声明
      • 匿名类
      • Throwable 接口
    • 新增操作符
      • 太空飞船操作符(<=>)
      • null 合并运算符(??)
    • 统一变量语法
    • 其他特性和变更
      • 常量数组
      • Switch 中的多个default默认值
      • Session_start 函数中的参数数组
      • Unserialize 函数引入过滤器
      • 整数除法函数 intdiv()
      • 补充*其他特性和变更
    • 补充*新函数
    • 补充*新的全局常量
    • 补充*变更的函数
    • 补充*摒弃一些老式的写法
    • 补充*不向后兼容的变更
    • 补充*在SAPI模块的变化
    • 补充*PHP7底层性能优化
  • PHP 7.1.x 新特性
    • 新特性
      • 可为空(Nullable)类型
      • 对称阵列解构
      • Void 函数
      • 类常量访问权限控制
      • 多异常捕获处理
      • list()现在支持键名
      • 支持为负的字符串偏移量
      • 补充*其他特性与变更
    • 补充*新的函数
    • 补充*新增的全局常量
    • 补充:不向后兼容的变更
    • 补充*废弃的特性
    • 补充*变更的函数
    • 补充*其他的变更
  • PHP7 开发工具
    • Eclipse 安装与配置
  • PHP 标准规范及开发技巧
    • PHP 标准规范 - PSR
    • PHP 开发技巧
    • 面向对象编程的基本原则
  • PHP7调试与性能分析
    • 调试 - Xdebug安装配置
      • 使用Eclipse调试
    • 性能分析 - Xhprof
    • 性能分析 - Vld
  • 附录*Ubuntu环境php开发配置
  • 附录*使用php开发扩展
  • 附录*浏览器插件
  • 附录*第三方类库
  • 附录*小问题整理
  • 附录*资料*工具
  • 附录*Composer
  • 附录*前端
  • 附录*进程
  • 附录*PHP的ticks机制
  • 附录* 通过composer发布自己的包
  • 附录*字符编码问题
  • 附录*注释
Powered by GitBook
On this page
  • 目录:
  • 简介:
  • Throwable层次结构:
  • Error 对象:
  • DivisionByZeroError 对象(Error的子实例)
  • ParseError 对象(Error的子实例)
  • 资料:

Was this helpful?

  1. PHP 7.0.x 新特性
  2. OOP 特性

Throwable 接口

目录:

  • 简介

  • Throwable 层次结构

  • Error 对象

简介:

PHP7提供了一种全局的接口,使得所有的类都可以基于此使用throw关键字。在PHP中,异常与错误经常会遇到。在PHP之前,异常可以被捕获,但是错误是不能被捕获的。从PHP7开始,任何完整程序或一部分程序中的Fatal错误都可以被捕获。

为了更好的捕获诸多错误(大多数的 Fatal 错误),PHP7 提供了 throwable 接口,异常与错误都继承于这个接口。

注意:wom自己写的PHP类是不能直接继承throwable 接口的,如果希望继承throwable 接口,需要继承某个异常类。

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。

Throwable层次结构:

  • Throwable

    • Error

      • ArithmeticError

      • DivisionByZeroError

      • AssertionError

      • ParseError

      • TypeError

    • Exception

      • ...

Error 对象:

现在大多数的Fatal错误情况会抛出一个Error实例,类似于异常捕获,Error实例可以被try/catch捕获,如下代码:

<?php
function iHaveError($object)
{
    return $object->iDontExist();
}

iHaveError(null);

echo "I am still running";

以上代码会产生一个Fatal 的错误,程序也停止运行,并且最后一行的echo语句不会被执行。

现在加入try/catch 后,代码如下:

<?php
function iHaveError($object)
{
    return $object->iDontExist();
}

try {
    iHaveError(null);
} catch(Error $e) {
    echo $e->getMessage();
}

echo "<br>I am still running";

再次执行以上代码,catch中的内容将会执行。并且代码会继续执行,最后的一行echo也会被输出。结果如下:

Call to a member function iDontExist() on null
I am still running

DivisionByZeroError 对象(Error的子实例)

大多数情况下,Error实例会在大部分 Fatal 错误的情况下被抛出,但是对于一些错误情况,只有Error的子实例(见Error层次图)会被抛出,当然使用 Error 对象也是可以的。

如下代码:

<?php
try {
    $a = 20;
    $division = $a % 0;
} catch(DivisionByZeroError $e) { // catch(Error $e) {
    echo $e->getMessage();
}

在PHP7之前,上面的代码会触发一个warning级别的错误,如今在PHP7中,执行上面的代码会抛出一个可以被捕获的DivisionByZeroError异常.如下:

Modulo by zero

补充:除以零的变化

<?php
var_dump(3/0);
var_dump(0/0);
var_dump(0%0);
?>

Output of the above example in PHP 5:

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Output of the above example in PHP 7:

Warning: Division by zero in %s on line %d
float(INF)

Warning: Division by zero in %s on line %d
float(NAN)

PHP Fatal error:  Uncaught DivisionByZeroError: Modulo by zero in %s line %d

ParseError 对象(Error的子实例)

当使用eval函数进行对字符串进行解析时,发生 Fatal 错误,如下

Parse error: syntax error, unexpected end of file in ....

如今在PHP7中,执行下面的代码会抛出一个可以被捕获的ParseError异常.如下:

<?php
try {
    $command = 20;
    $b = eval($command);
} catch (ParseError $e) {
    echo $e->getMessage();
}

捕获到的异常如下:

syntax error, unexpected end of file

资料:

Previous匿名类Next新增操作符

Last updated 6 years ago

Was this helpful?

— 把字符串作为PHP代码执行

eval函数
PHP 7 错误处理