在 PHP 中声明变量类型?

2022-08-30 09:45:19

我试图让我的Netbeans用PHP自动完成,我了解到这段代码在PHP中是有效的:

function blah(Bur $bur) {}

几个问题:

  1. 这实际上是否对我可以传递给blah方法的变量类型施加了任何限制?
  2. 如果这只是为了帮助IDE,那对我来说没关系。如果我不在函数中,如何在PHP中声明变量的类型?

答案 1

此类型提示仅适用于验证函数参数;你不能声明PHP变量必须始终属于某种类型。这意味着在您的示例中,当调用“blah”时,$bur必须是Bur类型,但$bur可以重新分配给函数中的非Bur值。

类型提示仅适用于类名或接口名;例如,您不能声明参数必须是整数。

PHP的类型提示的一个令人讨厌的方面,与Java不同,是不允许使用NULL值。因此,如果您想要传递 NULL 而不是对象的选项,则必须删除类型提示,并在函数顶部执行类似如下操作:

assert('$bur === NULL || $bur instanceof Bur');

编辑:最后一段自 PHP 5.1 起不适用;您现在可以使用 NULL 作为默认值,即使带有类型提示也是如此。

编辑:还可以安装 SPL 类型处理扩展,它为您提供了字符串、整数、浮点数、布尔值和枚举的包装器类型。

编辑:从 PHP 5.1 开始,您也可以使用“array”,从 PHP 5.4 开始,也可以使用“可调用”。

编辑:从 PHP 7.0 开始,您也可以使用“string”、“int”、“float”和“bool”。

编辑:从 PHP 7.4 开始,您可以将类/接口/特征的成员变量声明为特定类型,例如 ,并且以这种方式声明的变量不能分配给另一种类型的值。您还可以使用联合类型(如 PHP 8.0),也可以使用从 PHP 8.1 开始的联合类型中的类。public int $a;string|int

https://www.php.net/manual/en/language.types.declarations.php


答案 2
  1. 如果传递的值不是该类型的值,则为函数参数指定数据类型将导致 PHP 引发可捕获的致命错误。但请注意,您只能指定类的类型,而不能指定字符串或整数等基元。
  2. 大多数 IDE 都可以从 PHPDoc 样式注释(如果提供了)中推断出数据类型。例如:

/**
 * @var string
 */
public $variable = "Blah";

2021年更新:从 PHP 7 开始(此时已有好几年的历史),也可以为函数参数声明基元类型。可空性也可以用 ?从7.1开始,在类型前面。您现在也可以声明返回类型。所以这是现在有效的PHP:

public function hasFoo(?int $numFoos) :bool {

phpStorm(我目前首选的IDE)很乐意使用所有这些类型来完成代码,所以我不需要像以前那样多的phpDoc注释来打字。


推荐