• 【黄啊码】用PHP7性能居然是5.6的三倍?赶紧看看它有什么新特性


    大家好,我是黄啊码,最近说到php从入门到拆门,有网友说,门都还没进,怎么拆门?那咱们现在就从php7说起,至于入门的太简单,我就略过了,大家加油,不懂Q我吧。

    据网友测评,PHP 7+ 版本极大地改进了性能,在一些WordPress基准测试当中,性能可以达到PHP 5.6的3倍。

     PHP 7+ 版本新加特性如下表所示:

    目录

    PHP 标量类型与返回值类型声明

    那什么是强制类型,什么又是严格类型?

    那什么是严格类型?

    void 函数


    PHP 标量类型与返回值类型声明

    默认情况下,所有的PHP文件都处于弱类型校验模式。

    PHP 7 增加了标量类型声明的特性,标量类型声明有两种模式:

    • 强制模式 (默认)
    • 严格模式

    标量类型声明语法格式:

    declare(strict_types=1); 

    代码中通过指定 strict_types的值(1或者0),1表示严格类型校验模式,作用于函数调用和返回语句;0表示弱类型校验模式。

    可以使用的类型参数有:

    • int

    • float

    • bool

    • string

    • interfaces

    • array

    • callable

    那什么是强制类型,什么又是严格类型?

    比如:

    1. // 强制模式
    2. function sum(int ...$ints)
    3. {
    4. return array_sum($ints);
    5. }
    6. print(sum(3, '3', 9.1));
    7. ?>

    简单来说就是比如:你在做数字计算时,这里的字符串3会自动帮你强制转换成数字3,然后再次计算 ,又因为我们声明了这是整数类型,所以9.1会自动转换成9

    那什么是严格类型?

    黄啊码:我也不怎么说,就是不听话就报错吧,叫你传数字,你传字符串我就给你报个错,让你知道什么叫做对。

    哈哈哈,比如:

    1. // 严格模式
    2. declare(strict_types=1);
    3. function sum(int ...$ints)
    4. {
    5. return array_sum($ints);
    6. }
    7. print(sum(3, '3', 9.1));
    8. ?>

    假如我们把这句代码declare(strict_types=1);去掉,那运行毫无问题,但是,加上了就给你安了道门,过不了我这关,就别想继续走了,看这报错。。是不是贼难受?

    Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned.
    

    void 函数

    一个新的返回值类型void被引入。 这玩意看上去是不是特别熟悉,学习过java或者.net的应该特别清楚吧,就是我啥都不用返回,而在php7中返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,NULL 不是一个合法的返回值。

    返回的类型还有 void,定义返回类型为 void 的函数不能有返回值,即使返回 null 也不行。

    void 函数可以省去 return 语句,或者使用一个空的 return 语句。

    1. function swap(&$left, &$right) : void
    2. {
    3. if ($left === $right) {
    4. return;
    5. }
    6. $tmp = $left;
    7. $left = $right;
    8. $right = $tmp;
    9. }
    10. $a = 1;
    11. $b = 2;
    12. var_dump(swap($a, $b), $a, $b);

    结果:

    是不是特别的哇塞?? 

    PHP NULL 合并运算符

    PHP 7 新增加的 NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式。

    NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二个操作数。

    以前我们这样写三元运算符

    $site = isset($_GET['site']) ? $_GET['site'] : '黄啊码';

    现在我们可以直接这样写:

    $site = $_GET['site'] ?? '黄啊码';

    PHP 太空船运算符(组合比较符)

    php7还新出了一个运算符<=>,我把它当成上天符,因为官方叫它做太空船运算符,用于比较两个表达式 $a 和 $b,如果 $a 小于、等于或大于 $b时,它分别返回-1、0或1。

    实例

    1. <?php
    2. // 整型比较
    3. print( 1 <=> 1);
    4. print( 1 <=> 2);
    5. print( 2 <=> 1);
    6. // 浮点型比较
    7. print( 1.5 <=> 1.5);
    8. print( 1.5 <=> 2.5);
    9. print( 2.5 <=> 1.5);
    10. // 字符串比较
    11. print( "a" <=> "a");
    12. print( "a" <=> "b");
    13. print( "b" <=> "a");

    结果输出都是 0   -1   1 

    个人来讲,太空船符号比较鸡肋,毕竟大小我们有比较符号

    PHP 常量数组

    这个小知识点就不必多讲了,类似与变量数组,只不过php5.6用的是const进行声明

    1. // 使用 define 函数来定义数组
    2. define('sites', [
    3. 'Google',
    4. '黄啊码',
    5. 'Taobao'
    6. ]);
    7. print(sites[1]);
    8. ?>
    9. 输出:黄啊码

    PHP 匿名类 

    PHP 7 支持通过 new class 来实例化一个匿名类,这可以用来替代一些"用后即焚"的完整类定义。匿名类可以直接定义给变量,可以在方法中使用return返回,也可以当做参数传递给方法内部。其实,匿名类就像一个没有事先定义的类,而在定义的时候直接就进行了实例化。

    这里啊码一次性给了三个例子,你们自己尝尝鲜:

    1. class A {
    2. public $propA = 'A';
    3. public function getProp(){
    4. echo $this->propA;
    5. }
    6. }
    7. trait B {
    8. public function getName(){
    9. echo 'trait B';
    10. }
    11. }
    12. interface C {
    13. public function show();
    14. }
    15. $p4 = 'b4';
    16. $objC = new class($p4) extends A implements C {
    17. use B;
    18. private $prop1 = 'b1';
    19. protected $prop2 = 'b2';
    20. public $prop3 = 'b3';
    21. public function __construct($prop4){
    22. echo $prop4;
    23. }
    24. public function getProp(){
    25. parent::getProp();
    26. echo $this->prop1, '===', $this->prop2, '===',$this->prop3,'===', $this->propA;
    27. $this->getName();
    28. $this->show();
    29. }
    30. public function show(){
    31. echo 'show';
    32. }
    33. };
    34. $objC->getProp();

    PHP Closure::call()

    PHP 7 的 Closure::call() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。

    1. class A {
    2. private $x = 1;
    3. }
    4. // PHP 7 之前版本定义闭包函数代码
    5. $getXCB = function() {
    6. return $this->x;
    7. };
    8. // 闭包函数绑定到类 A 上
    9. $getX = $getXCB->bindTo(new A, 'A');
    10. echo $getX();
    11. print(PHP_EOL);
    12. // PHP 7+ 代码
    13. $getX = function() {
    14. return $this->x;
    15. };
    16. echo $getX->call(new A);
    17. ?>

    输出结果分别为:1    1 

    有网友说,php都到8了,为什么你还跟我说php7,我想问,php都到8了,为什么你写代码还用5呢?所以不是新的不好,而是老的稳定,毕竟姜还是老的辣。

    好了,今天的分享就这里,有问题的留个言,别忘了一键三连,下次我们还会再见!

    我是黄啊码,码字的码,退。。。退。。。退。。。朝! 

  • 相关阅读:
    【数据密集型系统设计】软件系统的可靠性、可伸缩性、可维护性
    Delay问题分析
    Meta因露骨AI图片陷入困境
    C++语言基础Day3-内联函数
    Redisson—分布式服务
    使用 Apache ECharts 实现圣都装饰的延期日历图
    JS 流行框架(八):ScrollReveal
    Linux网络编程(一)
    7-34 通讯录的录入与显示
    SYSCALL SWAPGS
  • 原文地址:https://blog.csdn.net/TiaoZhanJi_Xian/article/details/127863491