【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)
}