php7和PHP5对比有什么区别

php7和PHP5对比的新特性和性能优化

1. 抽象语法树(AST)

AST在PHP编译过程作为一个中间件的角色,替换原来直接从解释器吐出opcode的方式,让解释器(parser)和编译器(compliler)解耦,可以减少一些Hack代码,同时,让实现更容易理解和可维护

2. Natice TLS:

线程数据共享安全,开启一个全局线程用作数据共享内存空间

3. 指定参数 返回值类型

4. zval 结构的变化

5. 异常处理

PHP 5 的 try … catch … finally 无法处理传统错误,如果需要,你通常会考虑用 set_error_handler() 来 Hack 一下。但是仍有很多错误类型是 set_error_handler() 捕捉不到的

PHP 7引入 Throwable 接口,错误及异常都实现了 Throwable,无法直接实现 Throwable,但可以扩展 \Exception 和 \Error 类。可以用 Throwable 捕捉异常跟错误。\Exception 是所有PHP及用户异常的基类;\Error 是所有内部PHP错误的基类。

6. 新的参数解析方式

7. hashtable变化

buckets、Zvals不再单独分配内存,消除了很多没用的冗余。

8、空合并操作符(Null Coalesce Operator)

直接上例子:

$name = $name ?? "NoName";  // 如果$name有值就取其值,否则设$name成"NoName"

9、飞船操作符(Spaceship Operator)(组合比较操作符)

形式:(expr) <=> (expr)

左边运算对象小,则返回-1;左、右两边运算对象相等,则返回0;左边运算对象大,则返回1。

$name = ["Simen", "Suzy", "Cook", "Stella"];
usort($name, function ($left, $right) {
    return $left <=> $right;
});
print_r($name);

10、常量数组(Constant Array)

PHP 7 之前只允许类/接口中使用常量数组,现在 PHP 7 也支持非类/接口的普通常量数组了。

define("USER", [
  "name"  => "Simen",
  "sex"   => "Male",
  "age"   => "38",
  "skill" => ["PHP", "MySQL", "C"]
]);
// USER["skill"][2] = "C/C++";  // PHP Fatal error:  Cannot use temporary expression in write context in...

11、统一了变量语法

$goo = [
    "bar" => [
        "baz" => 100,
        "cug" => 900
    ]
];

$foo = "goo";

$$foo["bar"]["baz"];  // 实际为:($$foo)['bar']['baz']; PHP 5 中为:${$foo['bar']['baz']};
                      // PHP 7 中一个笼统的判定规则是,由左向右结合。

12、Throwable 接口

这是 PHP 7 引进的一个值得期待的新特性,将极大增强 PHP 错误处理能力。PHP 5 的 try … catch … finally 无法处理传统错误,如果需要,你通常会考虑用 set_error_handler() 来 Hack 一下。但是仍有很多错误类型是 set_error_handler() 捕捉不到的。PHP 7引入 Throwable 接口,错误及异常都实现了 Throwable,无法直接实现 Throwable,但可以扩展 \Exception 和 \Error 类。可以用 Throwable 捕捉异常跟错误。\Exception 是所有PHP及用户异常的基类;\Error 是所有内部PHP错误的基类。

$name = "Tony";
try {
    $name = $name->method();
} catch (\Error $e) {
    echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
}

try {
    $name = $name->method();
} catch (\Throwable $e) {
    echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
}

try {
    intp(5, 0);
} catch (\pisionByZeroError $e) {
    echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
}

13、use 组合声明

use 组合声明可以减少 use 的输入冗余。

use PHPGoodTaste\Utils\{
    Util,
    Form,
    Form\Validation,
    Form\Binding
};

14、一次捕捉多种类型的异常 / 错误

PHP 7.1 新添加了捕获多种异常/错误类型的语法——通过竖杠“|”来实现。

try {
      throw new LengthException("LengthException");
    //   throw new pisionByZeroError("pisionByZeroError");
    //   throw new Exception("Exception");
} catch (\pisionByZeroError | \LengthException $e) {
    echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
} catch (\Exception $e) {
    echo "出错消息 --- ", $e->getMessage(), PHP_EOL;
} finally {
    // ...
}

15、可见性修饰符的变化

PHP 7.1 之前的类常量是不允许添加可见性修饰符的,此时类常量可见性相当于 public。PHP 7.1 为类常量添加了可见性修饰符支持特性。总的来说,可见性修饰符使用范围如下所示:

  • 函数/方法:public、private、protected、abstract、final

  • 类:abstract、final

  • 属性/变量:public、private、protected

  • 类常量:public、private、protected

class YourClass 
{
    const THE_OLD_STYLE_CONST = "One";

    public const THE_PUBLIC_CONST = "Two";
    private const THE_PRIVATE_CONST = "Three";
    protected const THE_PROTECTED_CONST = "Four";
}

iterable 伪类型

PHP 7.1 引入了 iterable 伪类型。iterable 类型适用于数组、生成器以及实现了 Traversable 的对象,它是 PHP 中保留类名。

$fn = function (iterable $it) : iterable {
    $result = [];
    foreach ($it as $value) {
        $result[] = $value + 1000;
    }
    return $result;
};

$fn([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);

可空类型(Nullable Type)

PHP 7.1 引入了可空类型。看看新兴的 Kotlin 编程语言的一个噱头特性就是可空类型。PHP 越来越像“强类型语言了”。对于同一类型的强制要求,可以设置其是否可空。

$fn = function (?int $in) {
    return $in ?? "NULL";
};

$fn(null);
$fn(5);
$fn();  // TypeError: Too few arguments to function {closure}(), 0 passed in ...

Void 返回类型

PHP 7.1 引入了 Void 返回类型。

function first(): void {
    // ...
}

function second(): void {
    // ...
    return;
}

原创文章,作者:UTGBH,如若转载,请注明出处:http://www.wangzhanshi.com/n/9739.html

(0)
UTGBH的头像UTGBH
上一篇 2025年1月1日 16:49:49
下一篇 2025年1月1日 16:49:51

相关推荐

  • PHP7禁用Xdebug的方法

    PHP禁用Xdebug的设置方法:首先进入PHP安装目录;然后找到“/usr/local/php/php.d/xdebug.ini”;接着注释掉“xdebug.ini”里面的语句;…

    2025年1月1日
  • 浅谈laravel5.X安装centos6.5系统

    由于工作需要特去从零学习laravel。 真的是如laravel中文网所说的样子:一开始接触laravel最好是一键安装集成包,省得开头就被(composer)难住以至于未开始已经…

    2025年1月1日
  • echo和print语句怎么在PHP7中使用

    PHP echo 和 print 语句 echo 和 print 之间的差异: echo – 能够输出一个以上的字符串 print – 只能输出一个字符串,…

    php 2025年1月1日
  • PHP脚本设置无限执行时间的四种方法

    为 PHP 脚本设置无限执行时间是一个在特定场景下可能需要的操作,比如执行长时间运行的后台任务、数据迁移、大批量数据处理等。然而,值得注意的是,设置无限执行时间并不是一种推荐的做法…

    php 2024年12月17日
  • php7新特性新增的操作符是什么

    php7新特性新增两个操作符是<=>和??。 在 PHP7 中,引入了一个新的功能,即空合并运算符(??)。由于在 PHP7 项目中存在大量同时使用三元表达式和 iss…

    php 2025年1月1日
  • 《深度学习》PDF Deep Learning: Adaptive Computation and Machine Learning series

    《深度学习》PDF Deep Learning: Adaptive Computation and Machine Learning series 《深度学习》由全球知名的三位专家…

    2025年1月2日
  • php7抛出异常的方法

    PHP 7 改变了大多数错误的报告方式。不同于 PHP 5 的传统错误报告机制,现在大多数错误被作为 Error 异常抛出。 这种 Error 异常可以像普通异常一样被 try /…

    2025年1月1日
  • PHP7中的性能优化

    php7的一些特性 打破一切 PHP7要打破一切。 PHP开发人员应该接受打破版本之间向下兼容的定律。只要不允许大量的向后兼容,PHP7将是一个高度尊重的语言。 1、创建一个具体的…

    2025年1月1日
  • PHP-CLI命令行模式开发从新手到高手

    php-cli是php Command Line Interface的简称,如同它名字的意思,就是php在命令行运行的接口,区别于在Web服务器上运行的php环境(php-cgi,…

    php 2024年12月17日
  • php7和hvvm有什么区别

    PHP7和HHVM解析PHP代码的方式不同:PHP7使用标准的PHP解析器,生成HTML代码,然后发送给客户端,客户端显示出用户期望的内容;HHVM首先把PHP代码转化为HipHo…

    php 2025年1月1日

发表回复

登录后才能评论