美文网首页
PHP7新特性

PHP7新特性

作者: 吕艳凯 | 来源:发表于2020-04-20 19:33 被阅读0次

PHP7新增特性

新增操作符
1.“太空船”操作符“<=>”

语法:$c = $a <=> $b
如果$a > $b, $c 的值为1
如果$a == $b, $c 的值为0
如果$a < $b, $c 的值为-1

2.操作符“??”
如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

$username = isset($_GET['user]) ? $_GET['user] : 'nobody';  //原写法
$username = $_GET['user'] ?? 'nobody';     //现在

定义、声明、引用
1.define() 定义常量数组

define('ARR',['a','b']);
echo ARR[1];// a

2.强类型的声明
declare(strict_types=1),必须放在文件的第一行执行代码,当前文件有效!

declare(strict_types=1);
function add(int $a, int $b): int {
    return $a+$b;
}
 
echo add(1, 2);
echo add(1.5, 2.6);

php5无法执行,php7上述add函数传参必须与声明的类型相同,否则报错
强类型比弱类型的优缺点:
优点:类型不再自动转型,避免一些因为自动转型造成的错误
缺点:强类型语言代码编写要复杂些
3.命名空间批量引用

// PHP5写法 
use FooLibrary\Bar\Baz\ClassA; 
use FooLibrary\Bar\Baz\ClassB; 
// PHP7新语法写法 
use FooLibrary\Bar\Baz\{ ClassA, ClassB};

异常处理
在 PHP 7 中,很多致命错误以及可恢复的致命错误,都被转换为异常来处理了。
PHP7引入全局的throwable接⼝,Exception和部分Error实现了该接⼝。
因此错误可以像异常⼀样捕获
如果未捕获,则调⽤自定义异常处理函数进⾏处理
如果尚未注册异常函数,那么才按照传统的⽅式处理,报致命错误。
Error类并⾮继承⾃Exception类,因此不能使⽤catch(Exception $e)来捕获,⽽是使⽤catch(Error $e)或通过注册异常处理函数( set_exception_handler())来捕获。

php代码执行过程改变
PHP7 的内核中有一个重要的变化是加入了 AST
AST在PHP编译过程作为一个中间件的角色, 替换原来直接从解释器吐出opcode的方式, 让解释器(parser)和编译器(compliler)解耦, 可以减少一些Hack代码, 同时, 让实现更容易理解和可维护。
在 PHP5中,从 php 脚本到 opcodes 的执行的过程是:

1.Lexing:词法扫描分析,将源文件转换成 token 流;
2.Parsing:语法分析,在此阶段生成 op arrays。

PHP7 中在语法分析阶段不再直接生成 op arrays,而是先生成 AST,所以过程多了一步:

1.Lexing:词法扫描分析,将源文件转换成 token 流;
2.Parsing:语法分析,从 token 流生成抽象语法树;
3.Compilation:从抽象语法树生成 op arrays。

php7变更

字符串处理机制变更
含有十六进制字符的字符串不再视为数字

var_dump("0x123" == "291"); // false
var_dump(is_numeric("0x123")); // false
var_dump("0xe" + "0x1"); // 0
var_dump(substr("f00", "0x1")) // foo

参数处理机制修改
1.不支持重复参数命名
function func($b, $b) {} ;报错
2.func_get_arg()和func_get_args()这两个方法返回参数当前的值, 而不是传入时的值, 当前的值有可能会被修改

function foo($x) {
    $x++;
    echo func_get_arg(0);
}
foo(1); //返回2

foreach修改
1.foreach()循环对数组内部指针不再起作用

$arr = [1,2,3];
foreach ($arr as &$val) {
    echo current($arr);// php7 全返回0
}

2.按照值进行循环的时候, foreach是对该数组的拷贝操作

$arr = [1,2,3];
foreach ($arr as $val) {
    unset($arr[1]);
}
var_dump($arr);     //最新的php7依旧会打印出[1,2,3]。(ps:7.0.0不行) php5的会打印出[1,3]

相关文章

  • 高性能PHP7【笔记】

    一、搭建环境 二、PHP7新特性 A.OOP特性 1.类型声明 PHP7支持的形参类型声明的类型有整型、浮点型、字...

  • PHP7 新特性你知道多少?

    PHP7 新特性你知道多少? 2015.12.3发生了两件大事,PHP7问世了,Swift开源了。 最好的语言发布...

  • PHP7新特性

    标量类型声明PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 ...

  • PHP7新特性

    简介 PHP7是PHP编程语言的一个主要版本,并号称是开发Web应用程序的一次革命,可开发和交付移动企业和云应用。...

  • PHP7新特性

    1、形参类型声明:标量类型声明有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模...

  • PHP7新特性

    PHP7已经出来有一段时间了,据官方测试说明,其性能与PHP5.6相比有很大的提升。PHP7相比之前的版本有了许多...

  • PHP7 新特性

    1. 支持开启强类型模式 例1: 例2: 例3: 例2之所以在强制类型模式之下还可以执行,是因为例2是 int 转...

  • PHP7 新特性

    类型声明 看代码,一目了然了。 命名空间与use关键字批量声明 非混合模式 混合模式 复合模式 匿名类 匿名类的声...

  • php7新特性

    1. ??运算符(NULL合并运算符)把这个放在第一个说是因为我觉得它很有用。用法:$a = $_GET['a']...

  • php7 新特性

    一、php7.0 新的特性 1 . 可以强制指定变量类型 ,可使用declare(strict_types = 1...

网友评论

      本文标题:PHP7新特性

      本文链接:https://www.haomeiwen.com/subject/kurrihtx.html