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

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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值