当前位置: 代码迷 >> 综合 >> 【PHP学习(一)】PHP7 新特性
  详细解决方案

【PHP学习(一)】PHP7 新特性

热度:31   发布时间:2023-12-12 01:28:44.0

【PHP学习(一)】PHP7 主要的新特性

  • 1.太空船操作符 <=>
  • 2.类型声明
  • 3.null合并操作符
  • 4.常量数组
  • 5. namespace 的批量导入
  • 6.throwable接口
  • 7. Closure::call
  • 8. intdiv()
  • 9. list 的方括号写法
  • 10.抽象语法树(AST)

1.太空船操作符 <=>

左边值小于等于大于右边值时,分别返回-1、0、1

//整数
echo 1 <=> 1 #输出 0
echo 1 <=> 2 #输出 -1
echo 2 <=> 1 #输出 1
//浮点数
echo 1.5 <=> 1.5 #输出 0
echo 1.2 <=> 1.5 #输出 -1
echo 1.5 <=> 1.2 #输出 1
//字符串
echo 'a' <=> 'a' #输出 0
echo 'a' <=> 'b' #输出 -1
echo 'b' <=> 'c' #输出 1

2.类型声明

declare(strict_types=1); // 开启严格模式
function a(int ...$num):int{
    return array_sum($ints);
}
var_dump(a(2,'1.5',2.3));
// 当开启严格模式时,运行会报错
// 关闭严格模式时,php会尝试将‘1.5’转换为int类型,如果成功继续执行,如果失败则报错。

此段代码表示,传入的值必须是int类型,并且返回的类型也是int类型。类似于golang的写法:

function(a int,b int)(int,int){
    return b,a
}
declare(strict_types = 1 );
function b(?int ...$num)?int{
    return array_sum($ints);
}
//PHP7.1 在参数或返回值类型加上 ? ,表示返回值非null即声明的类型。
var_dump(b(null)); # null
var_dump(b(1)); # 1
var_dump(b('text')); # Error

3.null合并操作符

# version < 7.0
$page = isset($arr['key']) ? $arr['key'] : 0;
# 当有连续的三元运算时
$page = isset($arr['key']) ? $arr['key'] : (isset($arr['keys']) ? isset($arr['keys']) : 0);
# version >= 7.0
$page = $arr['key'] ?? 0;
$page = $arr['key'] ?? $arr['keys'] ?? 0;

4.常量数组

define('LOG_ERROR',['notice','warning','error'])

5. namespace 的批量导入

# version < 7.0
use Space\ClassA;
use Space\ClassB;
use Space\ClassC;
# version >= 7.0
use Space\{
    ClassA,ClassB,ClassC as C};

6.throwable接口

调用一个没有定义的函数,php5会报错,php7中错误可用try catch 捕获

# TODO version < 7.0 
try{
    undefined_func();
}catch(Exception $e){
    var_dump($e);
}
# 执行结果
Fatal error: Call to undefined function undefined_func() in D:\phpstudy_pro\WWW\index.php on line 5# TODO version > 7.0
try{
    undefined_func();
}catch(Throwable $e){
    var_dump($e);
}
# 执行结果
object(Error)#1 (7) {
    ["message":protected]=>string(43) "Call to undefined function undefined_func()"["string":"Error":private]=>string(0) ""["code":protected]=>int(0)["file":protected]=>string(29) "D:\phpstudy_pro\WWW\index.php"["line":protected]=>int(5)["trace":"Error":private]=>array(0) {
    }["previous":"Error":private]=>NULL
}

7. Closure::call

#version < 7.0 我们需要动态的给一个对象添加方法时,可通过Closure来复制一个闭包对象并绑定到一个$this对象和类作用域。
Class Numbers{
    private $number = 1; 
}
$func = function(){
    return $this->number + 1;
};
$test =  $func->bindTo(new Numbers,'Numbers')
echo $test;
# version > 7.0 可通过call来暂时绑定一个闭包对象到$this对象并调用。
Class Numbers{
    private $number = 1; 
}
$func = function(){
    return $this->number + 1;
};
echo $func->call(new Numbers); # 输出 2

8. intdiv()

intdiv(10,3);
# 相当于 
floor(10/3)
# 输出 3

9. list 的方括号写法

需要注意的是,这里的 [ ],并不是数组,只是list的简略形式。

//Example 1 :
$array = [1,2,3,4];
list($a,$b,$c,$d) = $array;
var_dump($a,$b,$c,$d);
# 输出
int(1)
int(2)
int(3)
int(4)
//Example 2 :
$array = [1,2,3,4];
[$a,$b,$c,$d] = $array;
var_dump($a,$b,$c,$d);
# 输出
int(1)
int(2)
int(3)
int(4)

10.抽象语法树(AST)

在这里插入图片描述
ZEND_AST_STMT_LIST : 表达式
ZEND_AST_ASSIGN:赋值
ZEND_AST_ZVAL: 对应 1

ZEND_AST_VAR 也是一个zval 对应 a

$a['b'] = 1;
var_dump($a);
# 输出
array(1) {
    ["b"]=>int(1)
}
  相关解决方案