Php 简明教程
PHP - Type Hints
PHP 支持在函数定义中的变量、类中属性或实例变量的声明时使用“类型提示”。PHP 被广泛认为是一种弱类型语言。在 PHP 中,在给变量赋值之前无需声明其类型。
PHP 解析器尽可能地尝试将变量转换为兼容类型。因此,如果传递的值之一是数字的字符串表示,而第二个是数字变量,PHP 会将字符串变量转换为数字以执行加法运算。
Example
请看以下示例:
<?php
function addition($x, $y) {
echo "First number: $x Second number: $y Addition: " . $x+$y;
}
$x="10";
$y=20;
addition($x, $y);
?>
它将生成以下 output −
First number: 10 Second number: 20 Addition: 30
但是,如果上述示例中的 $x 是不包含有效数字表现形式的字符串,则会出现错误。
<?php
function addition($x, $y) {
echo "First number: $x Second number: $y Addition: " . $x+$y;
}
$x="Hello";
$y=20;
addition($x, $y);
?>
它将生成以下 output −
PHP Fatal error: Uncaught TypeError: Unsupported operand types: string + int in hello.php:5
类型提示从 PHP 5.6 版本起受支持。这意味着您可以明确说明代码中声明变量的预期类型。PHP 允许您对函数参数、返回值和类属性进行类型提示。有了它,就可以编写更健壮的代码。
让我们在上述程序的加法函数中结合类型提示 −
function addition($x, $y) {
echo "First number: $x Second number: $y Addition: " . $x+$y;
}
类型提示特性主要由 IDE(集成开发环境)用于提示用户在函数声明中使用的参数的预期类型。
下图显示了 VS 代码编辑器在您键入时弹出的函数原型 −
如果光标悬停在函数名称上,则会显示参数和返回值的类型声明 −
请注意,仅在变量声明中使用数据类型并不能防止引发不匹配的类型异常,因为 PHP 是一种动态类型语言。换句话说,$x="10" 和 $y=20 仍然会计算结果为 30,而 $x="Hello" 会使解析器引发错误。
strict_types
PHP 可以强制执行更严格的类型转换规则,这样就不会将“10”隐式转换为 10。这可以通过在 declare() 语句中将 strict_types 指令设置为 1 来强制执行。declare() 语句必须是 PHP 代码中的第一个语句,紧跟在“ <?php ”标签后面。
Example
<?php
declare (strict_types=1);
function addition(int $x, int $y) {
echo "First number: $x Second number: $y Addition: " . $x+$y;
}
$x=10;
$y=20;
addition($x, $y);
?>
它将生成以下 output −
First number: 10 Second number: 20 Addition: 30
现在,如果将 $x 设置为“10”,则不会发生隐式转换,从而导致以下错误 −
PHP Fatal error: Uncaught TypeError: addition(): Argument #1 ($x) must be of type int, string given
VS Code IDE 也指示出相同的影响错误 −
从 PHP 7 开始,类型提示支持已扩展到函数返回值,以防止意外的返回值。您可以通过在冒号 (:) 符号后添加预期类型,在参数列表后添加类型提示返回值。
Type-hinting in Class
在 PHP 7.4 版本中,您可以从版本 7.4 开始在声明类属性和方法时使用类型提示。
Example
在以下示例中,类构造函数使用类型提示 −
<?php
declare (strict_types=1);
class Student {
public $name;
public $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
public function dispStudent() {
echo "Name: $this->name Age: $this->age";
}
}
$s1 = new Student("Amar", 21);
$s1->dispStudent();
?>
也可以在声明类属性时使用类型提示。
class Student {
public string $name;
public int $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
public function dispStudent() {
echo "Name: $this->name Age: $this->age";
}
}
程序开发中最常见的错误是 type errors 。类型提示功能有助于减少它们。