「PHP系列」PHP7 新特性:标量类型声明、返回值类型声明

本文介绍了PHP7及后续版本中的类型声明,包括标量类型声明、函数参数和返回值类型,void函数的作用以及严格类型模式。内容涵盖了类型检查、错误处理和IDE支持等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、标量类型声明

在 PHP 7 及以后的版本中,引入了类型声明,包括标量类型声明(scalar type declarations)。标量类型是指那些基本的数据类型,如整数(integer)、浮点数(float)、字符串(string)和布尔值(boolean)。

  1. 函数参数类型声明
function greet(string $name): void {
    echo "Hello, $name!";
}

greet("John"); // 正常
greet(42); // 致命错误,因为 42 不是一个字符串
  1. 函数返回值类型声明
function add(int $a, int $b): int {
    return $a + $b;
}

$result = add(2, 3); // $result 现在是 5

注意,虽然 add 函数的返回值类型声明为 int,但如果你尝试返回其他类型(如 floatstring),PHP 会在运行时发出一个致命错误。

  1. 类属性类型声明(从 PHP 7.4 开始):
class Person {
    public string $name;
    public int $age;

    public function __construct(string $name, int $age) {
        $this->name = $name;
        $this->age = $age;
    }
}

$person = new Person("John", 30); // 正常
$person = new Person(42, "thirty"); // 致命错误,因为参数类型不匹配
  1. void 类型

void 类型表示该函数不返回任何值。这主要用于确保函数没有意外的返回值。

function printMessage(): void {
    echo "This is a message.";
    // 注意:这里不能有任何 return 语句(除了 return;)
}
  1. 可空类型(从 PHP 7.1 开始):

通过在类型名称后添加 ?,可以指定一个参数或返回值可以为该类型或 null

function greet(?string $name): void {
    if ($name === null) {
        echo "Hello, anonymous!";
    } else {
        echo "Hello, $name!";
    }
}

greet("John"); // 输出 "Hello, John!"
greet(null); // 输出 "Hello, anonymous!"
  1. 严格类型模式(declare(strict_types=1);):

在文件顶部使用 declare(strict_types=1); 语句,可以使 PHP 在函数内部使用严格的类型检查。这意味着,即使两个变量在宽松比较下是相等的(例如,字符串 “5” 和整数 5),但在严格模式下,它们的类型也必须完全匹配。

二、返回值类型声明

在PHP中,返回值类型声明允许你指定一个函数应该返回什么类型的值。如果函数返回的值不是声明的类型,那么PHP会抛出一个TypeError异常(在PHP 7.0及以上版本中)。

要声明一个函数的返回值类型,你需要在函数定义的末尾使用冒号(:)和类型名称。以下是一些示例:

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

// 返回值是字符串
function greet(string $name): string {
    return "Hello, $name!";
}

// 返回值可以是null或string
function getOptionalString(?string $name = null): ?string {
    return $name ?: 'Default Name';
}

// 返回值是void,表示不返回任何值
function logMessage(string $message): void {
    error_log($message);
}

// 使用函数
$sum = add(5, 3); // $sum 是 int 类型,值为 8
$greeting = greet('World'); // $greeting 是 string 类型,值为 "Hello, World!"
$optional = getOptionalString(); // $optional 是 string 类型,值为 "Default Name"
logMessage('This is a log message'); // 不返回任何值

// 尝试返回错误类型的值将会导致TypeError
function wrongReturnType(): int {
    return 'This is a string'; // TypeError: Return value must be of type int, string returned
}

当使用declare(strict_types=1);指令时,PHP会执行更严格的类型检查。这意味着在函数内部,参数的类型也会被严格检查。例如:

declare(strict_types=1);

function multiplyByTwo(int $number): int {
    return $number * 2;
}

// 使用严格类型检查
$result = multiplyByTwo('4'); // TypeError: Argument 1 passed to multiplyByTwo() must be of the type int, string given

在上面的例子中,由于启用了严格类型检查,尝试将一个字符串传递给期望整数参数的函数会导致TypeError异常。

需要注意的是,不是所有的PHP函数都支持返回值类型声明。例如,魔术方法(如__construct(), __destruct(), __call(), __callStatic()等)和内部函数(如array_map(), strlen()等)通常不支持返回值类型声明。这些函数的返回类型是由PHP引擎本身确定的。

三、void 函数

在 PHP 中,void 是一种特殊的返回类型,用于表示函数不返回任何值。当你使用 void 作为函数的返回类型时,你实际上是告诉 PHP 编译器该函数不应该返回任何值(即不应该有 return 语句,或者 return 语句后不应该跟有任何值)。

使用 void 返回类型声明有几个好处:

  1. 提高代码清晰度:通过声明 void 返回类型,你明确地告诉其他开发者或未来的自己,这个函数不应该返回任何值。
  2. 增强类型安全:如果函数意外地返回了一个值,PHP 会在运行时抛出一个 TypeError 异常。
  3. 更好的 IDE 支持:集成开发环境(IDE)可以利用返回类型声明来提供更准确的自动补全和错误检查。

下面是一个使用 void 返回类型声明的示例:

function logMessage(string $message): void {
    error_log($message);
    // 这里不应该有 return 语句,或者 return 语句后不应该跟有任何值
    // return; // 这是允许的,但不必要
    // return null; // 这会导致 TypeError
    // return $someValue; // 这也会导致 TypeError
}

// 调用函数
logMessage('This is a log message');

在上面的示例中,logMessage 函数接受一个字符串参数 $message 并将其记录到错误日志中。由于我们声明了返回类型为 void,因此这个函数不应该有任何 return 语句(尽管有一个空的 return; 语句是允许的,但通常是不必要的)。

如果你尝试在返回类型为 void 的函数中使用 return 语句并返回一个值,PHP 将会抛出一个 TypeError 异常。这有助于在开发过程中捕获潜在的错误。

PHP 7.0 引入了返回类型声明,但 void 返回类型声明是在 PHP 7.1 中引入的。因此,要使用 void 返回类型声明,你需要确保你的 PHP 版本至少是 7.1 或更高。

四、相关链接

  1. php官网
  2. php_Github
  3. PHP实现Token
  4. 「PHP系列」PHP简介与起步
  5. 「PHP系列」PHP语法介绍
  6. 「PHP系列」PHP变量
  7. 「PHP系列」PHP echo/print语句、数据类型详解
  8. 「PHP系列」PHP 常量/字符串、类型比较
  9. 「PHP系列」PHP 运算符详解
  10. 「PHP系列」If…Else语句/switch语句
  11. 「PHP系列」数组详解
  12. 「PHP系列」PHP数组排序及运用场景
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

·零落·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值