首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【黄啊码】用PHP7性能居然是5.6的三倍?赶紧看看它有什么新特性

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

作者头像
黄啊码
发布2025-09-10 14:48:28
发布2025-09-10 14:48:28
7600
代码可运行
举报
运行总次数:0
代码可运行

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

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

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

目录

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

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

那什么是严格类型?

void 函数


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

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

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

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

标量类型声明语法格式:

代码语言:javascript
代码运行次数:0
运行
复制
declare(strict_types=1); 

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

可以使用的类型参数有:

  • int
  • float
  • bool
  • string
  • interfaces
  • array
  • callable

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

比如:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
// 强制模式
function sum(int ...$ints)
{
   return array_sum($ints);
}

print(sum(3, '3', 9.1));
?>

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

那什么是严格类型?

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

哈哈哈,比如:

代码语言:javascript
代码运行次数:0
运行
复制
<?php
// 严格模式
declare(strict_types=1);

function sum(int ...$ints)
{
   return array_sum($ints);
}

print(sum(3, '3', 9.1));
?>

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

代码语言:javascript
代码运行次数:0
运行
复制
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 语句。

代码语言:javascript
代码运行次数:0
运行
复制
<?php
function swap(&$left, &$right) : void
{
    if ($left === $right) {
        return;
    }

    $tmp = $left;
    $left = $right;
    $right = $tmp;
}

$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);

结果:

是不是特别的哇塞??

PHP NULL 合并运算符

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
$site = isset($_GET['site']) ? $_GET['site'] : '黄啊码';

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

代码语言:javascript
代码运行次数:0
运行
复制
$site = $_GET['site'] ?? '黄啊码';

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

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

实例

代码语言:javascript
代码运行次数:0
运行
复制
<?php
// 整型比较
print( 1 <=> 1);
print( 1 <=> 2);
print( 2 <=> 1);

// 浮点型比较
print( 1.5 <=> 1.5);
print( 1.5 <=> 2.5);
print( 2.5 <=> 1.5);

// 字符串比较
print( "a" <=> "a");
print( "a" <=> "b");
print( "b" <=> "a");

结果输出都是 0 -1 1

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

PHP 常量数组

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

代码语言:javascript
代码运行次数:0
运行
复制
<?php
// 使用 define 函数来定义数组
define('sites', [
   'Google',
   '黄啊码',
   'Taobao'
]);

print(sites[1]);
?>
输出:黄啊码

PHP 匿名类

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

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

代码语言:javascript
代码运行次数:0
运行
复制
class A {     
    public $propA = 'A';     
    public function getProp(){         
    echo $this->propA;     
    } 
} 
trait B {     
    public function getName(){ 
    echo 'trait B';     
    } 
} 
interface C {
    public function show(); 
} 
$p4 = 'b4'; 
$objC = new class($p4) extends A implements C {
    use B; 
    private $prop1 = 'b1'; 
    protected $prop2 = 'b2';
    public $prop3 = 'b3';
    public function __construct($prop4){
        echo $prop4;
    }
    public function getProp(){         
        parent::getProp();         
        echo $this->prop1, '===', $this->prop2, '===',$this->prop3,'===', $this->propA;         
        $this->getName();         
        $this->show();     
    }     
    public function show(){         
        echo 'show';     
    } 
};   
$objC->getProp();

PHP Closure::call()

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

代码语言:javascript
代码运行次数:0
运行
复制
<?php
class A {
    private $x = 1;
}

// PHP 7 之前版本定义闭包函数代码
$getXCB = function() {
    return $this->x;
};

// 闭包函数绑定到类 A 上
$getX = $getXCB->bindTo(new A, 'A'); 

echo $getX();
print(PHP_EOL);

// PHP 7+ 代码
$getX = function() {
    return $this->x;
};
echo $getX->call(new A);
?>

输出结果分别为:1 1

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PHP 标量类型与返回值类型声明
    • 那什么是强制类型,什么又是严格类型?
    • 那什么是严格类型?
  • void 函数
  • PHP NULL 合并运算符
  • PHP 太空船运算符(组合比较符)
  • PHP 常量数组
  • PHP 匿名类
  • PHP Closure::call()
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档