php5和php7终究有哪些变化?让我来带你研究

  • 新增了一些操作符<=>、??
    <=> 还有个骚气的名字 太空船运算符,话说 摘了眼镜是有点像太空船哈
    那怎么用呢? 不多说了上代码
$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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mr.杰瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值