- 新增了一些操作符<=>、??
<=> 还有个骚气的名字 太空船运算符,话说 摘了眼镜是有点像太空船哈
那怎么用呢? 不多说了上代码
$b=3;
$c=1;
$d=3;
var_dump($b<=>$d); //b等于d 0
var_dump($b<=>$c); //b大于c 1
var_dump($c<=>$d); // c小于d -1
?? 这个怎么用呢?
$a = 0;
$a = $a ?? 10;
$b = $b ?? 5;
var_dump($a);
var_dump($b);
有没有发现,?? 可以等价于 isset($a) ? $a : 10
- 增加了返回类型和标量类型的声明 (指定参数的类型和返回值的类型)
function myTest(int $age) : string
{
return $age;
}
var_dump(myTest('1'));
- 可以直接定义常量数组 (可以直接定义一个常量数组)
define('language', ['php', 'java', 'jsp', 'asp']);
var_dump(language);
- 增加匿名类 (直接用 new class 给一个变量赋值一个匿名类对象)
$stu=new class(){
public $name='tom';
public function __construct(){
echo "我是匿名类";
}
public function test()
{
echo '测试一下';
return 1;
}
};
var_dump($stu);
var_dump($stu->test());
- 增加call()方法($funcName->call(new className)、向类绑定匿名函数)
class A {private $x = 1;}
// Pre PHP 7 代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();
// PHP 7+ 代码
$getX = function() {return $this->x;};
echo $getX->call(new A);
- 增加了上下文敏感的词法分析
class Collection {
public function foreach($arr) {
return $this;
}
public function in($arr){
return $this;
}
public function sort($condition){
return $this;
}
public function echo($condition){
return 'ok';
}
}
$collection = new Collection();
var_dump($collection->in(4)->foreach(5)->sort(53)->echo(3));
感觉就是输出最后一个
- 变量存储字节减小,减少内存占用,提升变量操作速度
(存储变量的结构体变小,尽量使结构体里成员共用内存空间,减少引用,这样内存占用降低,变量的操作速度得到提升) - 改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率
(数组结构的改变,数组元素和hash映射表在php5中会存入多个内存块,php7尽量将它们分配在同一块内存里,降低了内存占用、提升了cpu缓存命中率
字符串结构体的改变,字符串信息和数据本身原来是分成两个独立内存块存放,php7尽量将它们存入同一块内存,提升了cpu缓存命中率)
总之就是分配空间集中管理了。 - 改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率
垃圾回收机制和php有区别
PHP5和PHP7的垃圾回收机制都属于引用计数,但是在复杂数据类型的算法处理上:
在 PHP7 中 zval 有了新的实现方式。
$a=['a'];
$a[] = $a;
php5 计2次
php7 计1次
php 5 计数器 放内存堆里
php7 _zend_value里面有计数器
最基础的变化就是 zval 需要的内存不再是单独从堆上分配,不再自己存储引用计数。复杂数据类型(比如字符串、数组和对象)的引用计数由其自身来存储。这种实现方式有以下好处:
简单数据类型不需要单独分配内存,也不需要计数;
不会再有两次计数的情况。在对象中,只有对象自身存储的计数是有效的;
由于现在计数由数值自身存储,所以也就可以和非 zval 结构的数据共享,比如 zval 和 hashtable key 之间;
其他的等我理解了,再来补充
附上官方文档
https://www.php.net/manual/zh/migration70.incompatible.php
https://www.php.net/manual/zh/index.php