Skip to content

Menu
Menu

PHP7新特性

Posted on 2022年12月11日2023年2月2日 by zhezimi

7.0 新特性

1:标量类型声明【7.0】

标量类型声明有两种模式:强制(默认)和严格模型,现在可以使用下列类型参数(无论是强制模式还是严格模式):字符串(string),整数(int),浮点数(float)以及布尔值(bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和回调类型。

<?php
// Coercive mode
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1));

输出结果:

int(9)

要使用严格模式,一个declare声明指令必须放在文件的顶部,这意味着严格声明标量是基于文件可配的。这个指令不仅影响参数的类型声明,也影响到函数的返回值声明。

<?php
// Coercive mode
declare(strict_types=1);
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1));

输出结果:

Fatal error: Uncaught TypeError: Argument 2 passed to sumOfInts() must be of the type integer, string given….

2:返回值类型声明【7.0】

PHP7增加了对返回类型的声明,类似于参数类型声明。

<?php
function arraysSum(array ...$arrays): array
{
    return array_map(function (array $array): int {
        return array_sum($array);
    }, $arrays);
}

print_r(arraysSum([1, 2, 3], [4, 5, 6], [7, 8, 9]));

输出结果

Array ( [0] => 6 [1] => 15 [2] => 24 )

假如我定义返回类型是array,实际返回是string,来看下报错提示

<?php
function arraysSum(array ...$arrays): array
{
    $number = 0;
    foreach ($arrays as $value) {
        $number += array_sum($value);
    }
    return $number;
}

print_r(arraysSum([1, 2, 3], [4, 5, 6], [7, 8, 9]));

输出结果:

Fatal error: Uncaught TypeError: Return value of arraysSum() must be of the type array, integer returned ….

3:null合并运算符【7.0】

由于日常使用中存在大量使用三元表达式和isset的情况,那么我们可以使用null合并运算符(??)这个语法糖。如果变量存在且值不为null,它就会返回自身的值,否则返回它的第二个操作数。

链接:http://127.0.0.1/demo.php?user_name=zhangsan

<?php
$userName = isset($_GET['user_name']) ? $_GET['user_name'] : "nobody";
echo $userName;

输出结果:

zhangsan

我们用null合并运算符来改一下这个代码

<?php
$userName = $_GET['user_name'] ?? "nobody";
echo $userName;

输出结果

zhangsan

4:太空操作符【7.0】

太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。

<?php
// 整数
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// 浮点数
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

5:通过define()定义常量数组【7.0】

Array类型的常量可以通过define来定义,在PHP5.6中仅能通过const定义

<?php
const ANIMALS = array('dog', 'cat', 'bird');
echo ANIMALS[1] . PHP_EOL; // 将输出 "cat"

// 常量数组
define('ANIMALS', array(
    'dog',
    'cat',
    'bird'
));
echo ANIMALS[1] . PHP_EOL; // 将输出 "cat"

输出结果:

cat cat

个人感觉,这个特性用处不大。

6:匿名类【7.0】

现在支持通过new class 来实例化一个匿名类,主要用来创建一次性的简单对象,也解决了类命名的问题。每次创建一个新类,都要想着起什么名字好,匿名类解决了这个问题。

<?php
// 使用显性类
class Logger
{
public function log($msg)
{
echo $msg;
}
}

$util->setLogger(new Logger());

// 使用匿名类
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});

详细文档请参考:https://www.php.net/manual/zh/language.oop5.anonymous.php

7:整数除法函数 intdiv()【7.0】

新加的函数 intdiv() 用来进行 整数的除法运算。

<?php
var_dump(intdiv(10, 3));
//以前的方法
var_dump((int)(10 / 3));

输出结果:

int(3) int(3)

7.1 新特性

1:可为空(Nullable)类型【7.1】

参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。

当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。

<?php
function testReturn(): ?string
{
return 'elePHPant';
}

var_dump(testReturn());

输出结果:

string(9) “elePHPant”

<?php
function testReturn(): ?string
{
    return null;
}

var_dump(testReturn());

输出结果:

NULL

<?php
function testReturn(?string $name)
{
    return $name;
}
var_dump(testReturn('elePHPant'));

输出结果:

string(9) “elePHPant”

<?php
function testReturn(?string $name)
{
return $name;
}

var_dump(testReturn(null));

输出结果:

NULL

2:void 函数【7.1】

一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。

<?php

function test(): void
{
return;
}

$result = test();
var_dump($result);

输出结果:

NULL

试图去获取一个 void 方法的返回值会得到 null ,并且不会产生任何警告。这么做的原因是不想影响更高层次的方法。

3:多异常捕获处理【7.1】

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用。

<?php
try {
// some code
} catch (FirstException|SecondException $e) {
// handle first and second exceptions
}

7.2 新特性

1:新的对象类型【7.2】

这种新的对象类型, object, 引进了可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型。

<?php

class Student
{

}

class Teacher
{

}

function test(object $obj): object
{
return new $obj();
}

$student = test(new Student());
var_dump($student);

$teacher = test(new Teacher());
var_dump($teacher);

输出结果:

object(Student)#2 (0) {
}
object(Teacher)#3 (0) {
}

7.4 新特性

1:属性添加限定类型 【7.4】

类的属性中现在支持添加指定的类型

<?php

class User
{
public int $id;
public string $name;
}

$user = new User();
$user->id = 'zhangsan';
echo "<pre/>";
print_r($user);

输出结果:

Fatal error: Uncaught TypeError: Typed property User::$id must be int, string used …..

上面的例子中,会强制要求 $user->id 只能为 int 类型,同时 $user->name 只能为 string 类型。

2:箭头函数【7.4】

<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
var_dump($nums);

输出结果:

array(4) { [0]=> int(10) [1]=> int(20) [2]=> int(30) [3]=> int(40) }

3:数组展开操作【7.4】

<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];

参考文档:

https://www.php.net/manual/zh/appendices.php

相关文章

  • PHP-FPM异常问题

  • 依赖注入容器

  • 生成器

  • 错误与异常

  • 浮点数精度问题

发表评论 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

近期文章

  • 排查网络故障常用命令
  • PHP-FPM异常问题
  • RabbitMQ 1:介绍
  • 观察者模式
  • 装饰者模式

近期评论

没有评论可显示。

分类

  • cdn
  • css
  • docker
  • git
  • http
  • javascript
  • linux
  • mysql
  • nginx
  • php
  • RabbitMQ
  • 代码规范
  • 性能
  • 正则表达式
  • 网络协议
  • 设计模式
© 2025 | Powered by Minimalist Blog WordPress Theme