首页 / PHP 入门教程 / PHP 7 新特性回顾

PHP 入门教程

PHP 7 新特性回顾

本教程共 65 篇 · 第 45 篇 · 更新于 2026-07-24 · 约 10 分钟阅读

PHPPHP8PHP7标量类型返回类型Null合并太空船运算符

45. PHP 7 新特性回顾

本节目标:掌握 PHP 7 引入的核心新特性,能够使用标量类型声明、返回类型、?? 运算符等现代语法编写更健壮的代码。

PHP 7 于 2015 年发布,是 PHP 发展史上的重要里程碑。它的执行速度比 PHP 5.6 提升了两倍以上,同时引入了大量让代码更严谨的语法特性。本节将回顾最常用的几项。


1. 标量类型声明

PHP 7 允许在函数参数中声明标量类型:intfloatstringbool

在 PHP 5 中,只能声明 arraycallable 和类名。PHP 7 补齐了这个短板。

<?php
function add(int $a, int $b): int
{
    return $a + $b;
}

echo add(1, 2);      // 3
echo add("1", "2");  // 3(字符串自动转为整数)

默认情况下,PHP 会尝试强制类型转换。如果传入 "3.14",它会转为 3

若希望严格匹配类型,可在文件开头加上:

<?php
declare(strict_types=1);

function add(int $a, int $b): int
{
    return $a + $b;
}

echo add(1.5, 2); // TypeError: 必须是整数
Tip

strict_types=1 只对当前文件生效,不影响被调用的其他文件。


2. 返回类型声明

函数可以声明返回值的类型,让代码意图更清晰。

<?php
function greet(string $name): string
{
    return "你好,{$name}";
}

function divide(float $a, float $b): ?float
{
    if ($b == 0) {
        return null;
    }
    return $a / $b;
}

?float 表示可空类型,允许返回 floatnull

Note

返回类型不匹配时会抛出 TypeError。配合 strict_types=1,检查会更严格。


3. Null 合并运算符 ??

判断变量是否存在且不为 null,是日常开发中最频繁的操作之一。PHP 7 引入了 ?? 运算符,让代码大幅简化。

以前这样写:

<?php
$name = isset($_GET['name']) ? $_GET['name'] : '访客';

现在可以写成:

<?php
$name = $_GET['name'] ?? '访客';

?? 会检查左侧变量是否存在且不为 null,满足则返回左侧值,否则返回右侧默认值。

连续使用也很方便:

<?php
$host = $config['db']['host'] ?? 'localhost';

如果 $config['db']['host'] 不存在,直接返回 'localhost',不会报错。


4. 太空船运算符 <=>

<=> 用于比较两个值,返回 -101

  • 左侧小于右侧,返回 -1
  • 两侧相等,返回 0
  • 左侧大于右侧,返回 1
<?php
echo 1 <=> 2;  // -1
echo 2 <=> 2;  // 0
echo 3 <=> 2;  // 1

用在 usort 排序中非常顺手:

<?php
$numbers = [3, 1, 4, 1, 5];

usort($numbers, function ($a, $b) {
    return $a <=> $b;
});

print_r($numbers); // [1, 1, 3, 4, 5]
Tip

字符串同样支持 <=>,按字母顺序比较。


5. 匿名类

PHP 7 支持直接实例化匿名类,适合临时使用一次的场景。

<?php
$util = new class {
    public function sayHello(): string
    {
        return '你好';
    }
};

echo $util->sayHello();

匿名类也可以继承父类或实现接口:

<?php
interface Logger {
    public function log(string $msg): void;
}

$logger = new class implements Logger {
    public function log(string $msg): void
    {
        echo "[日志] {$msg}\n";
    }
};

$logger->log('系统启动');
Note

匿名类没有类名,调试时会在堆栈中显示为 class@anonymous。复杂逻辑仍建议定义具名类。


6. 其他值得了解的特性

特性说明
常量数组define('FRUITS', ['苹果', '香蕉']);
unserialize 过滤增强安全性,防止对象注入
整除函数 intdiv()intdiv(10, 3) 返回 3
异常层次改进ErrorException 都实现 Throwable
<?php
try {
    $result = 1.0 / 0.0; // 浮点数除零返回 INF,不抛异常
} catch (Throwable $e) {
    echo '捕获到错误:' . $e->getMessage();
}

小结

PHP 7 让代码从”松散”走向”严谨”。标量类型和返回类型提升了可读性,??<=> 减少了样板代码。建议新项目中优先使用这些语法。


来源:参考了 runoob「PHP 7 新特性」、PHP 官方文档,改写后所得。