PHP7的新特性让【黄啊码】性能提升至5.6的三倍,这是怎么回事呢?

2026-04-02 03:021阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1930个文字,预计阅读时间需要8分钟。

PHP7的新特性让【黄啊码】性能提升至5.6的三倍,这是怎么回事呢?

您好,我是黄码,最近说到PHP,从入门到拆门,有网友说门还没进呢,怎么拆门?他们现在就从PHP7说起,说到入门的简单,我就看过了,大家加油,不懂Q我。


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

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

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

目录

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

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

​​那什么是严格类型?​​

​​void 函数​​


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

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

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

PHP7的新特性让【黄啊码】性能提升至5.6的三倍,这是怎么回事呢?

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

标量类型声明语法格式:

declare(strict_types=1);

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

可以使用的类型参数有:

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

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

比如:

<?php
// 强制模式
function sum(int ...$ints)
{
return array_sum($ints);
}

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

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

那什么是严格类型?

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

哈哈哈,比如:

<?php
// 严格模式
declare(strict_types=1);

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

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

假如我们把这句代码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 语句。

<?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,如果是,它就会返回自身的值,否则返回它的第二个操作数。

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

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

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

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

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

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

实例

<?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进行声明

<?php
// 使用 define 函数来定义数组
define('sites', [
'Google',
'黄啊码',
'Taobao'
]);

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

PHP 匿名类

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

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

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() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。

<?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呢?所以不是新的不好,而是老的稳定,毕竟姜还是老的辣。

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

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


标签:

本文共计1930个文字,预计阅读时间需要8分钟。

PHP7的新特性让【黄啊码】性能提升至5.6的三倍,这是怎么回事呢?

您好,我是黄码,最近说到PHP,从入门到拆门,有网友说门还没进呢,怎么拆门?他们现在就从PHP7说起,说到入门的简单,我就看过了,大家加油,不懂Q我。


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

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

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

目录

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

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

​​那什么是严格类型?​​

​​void 函数​​


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

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

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

PHP7的新特性让【黄啊码】性能提升至5.6的三倍,这是怎么回事呢?

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

标量类型声明语法格式:

declare(strict_types=1);

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

可以使用的类型参数有:

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

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

比如:

<?php
// 强制模式
function sum(int ...$ints)
{
return array_sum($ints);
}

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

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

那什么是严格类型?

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

哈哈哈,比如:

<?php
// 严格模式
declare(strict_types=1);

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

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

假如我们把这句代码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 语句。

<?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,如果是,它就会返回自身的值,否则返回它的第二个操作数。

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

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

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

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

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

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

实例

<?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进行声明

<?php
// 使用 define 函数来定义数组
define('sites', [
'Google',
'黄啊码',
'Taobao'
]);

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

PHP 匿名类

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

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

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() 有着更好的性能,将一个闭包函数动态绑定到一个新的对象实例并调用执行该函数。

<?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呢?所以不是新的不好,而是老的稳定,毕竟姜还是老的辣。

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

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


标签: