一、标量类型声明
在 PHP 7 及以后的版本中,引入了类型声明,包括标量类型声明(scalar type declarations)。标量类型是指那些基本的数据类型,如整数(integer)、浮点数(float)、字符串(string)和布尔值(boolean)。
- 函数参数类型声明:
function greet(string $name): void {
echo "Hello, $name!";
}
greet("John"); // 正常
greet(42); // 致命错误,因为 42 不是一个字符串
- 函数返回值类型声明:
function add(int $a, int $b): int {
return $a + $b;
}
$result = add(2, 3); // $result 现在是 5
注意,虽然 add
函数的返回值类型声明为 int
,但如果你尝试返回其他类型(如 float
或 string
),PHP 会在运行时发出一个致命错误。
- 类属性类型声明(从 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"); // 致命错误,因为参数类型不匹配
- void 类型:
void
类型表示该函数不返回任何值。这主要用于确保函数没有意外的返回值。
function printMessage(): void {
echo "This is a message.";
// 注意:这里不能有任何 return 语句(除了 return;)
}
- 可空类型(从 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!"
- 严格类型模式(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
返回类型声明有几个好处:
- 提高代码清晰度:通过声明
void
返回类型,你明确地告诉其他开发者或未来的自己,这个函数不应该返回任何值。 - 增强类型安全:如果函数意外地返回了一个值,PHP 会在运行时抛出一个
TypeError
异常。 - 更好的 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 或更高。