PHP中声明变量类型的方法?

64

我试图让我的Netbeans在PHP中自动完成,我发现这段代码在PHP中是有效的:

function blah(Bur $bur) {}

有几个问题:

  1. 这实际上会限制我可以传递给 blah 方法的变量类型吗?
  2. 如果这只是为了帮助 IDE,那对我来说没问题。如果我不在函数中,如何声明 PHP 变量的类型?
5个回答

86

这种类型提示仅适用于验证函数参数;您无法声明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 可以使用“callable”。

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

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

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


4
完整而出色的回答。我承认我的主要关注点是让我的IDE提示,我已经在这里找到了解决方法 https://dev59.com/pEbRa4cB1Zd3GeqPwxOy...。个人而言,我觉得PHP的许多方面都是令人沮丧的hack,但这只是我对有类型语言的偏好。 - Dan Rosenstark
4
没关系,即使是那些不太喜欢强类型语言的人也同意你的看法 :) - J Cooper
4
PHP未来的一个很好的改进是添加声明类型或将其保持为动态。希望未来的PHP版本中能够实现这一点。 - Dr Casper Black
2
实际上,您可以声明 myFunc(MyClass $x = NULL),然后调用 myFunc(NULL)myFunc() 而不会出错。 - JW.
很遗憾,你不能指定一个对象数组,例如:functionName(int[] $someIds)functionName(SomeObject[] $someObjects),但是有部分解决方法:https://dev59.com/KlsX5IYBdhLWcg3wDsA8#34273821 - mikhail-t
显示剩余4条评论

42
  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注释进行键入。


如果我不在一个类中怎么办?$variable是来自一个包含的PHP文件... 我想我已经接近我需要的地方了... - Dan Rosenstark
无需测试。根据PHP文档,“未能满足类型提示会导致可捕获的致命错误。” http://ch2.php.net/language.oop5.typehinting - Dan Rosenstark
我确认,在Eclipse PDT中它完美地工作,感谢提到“大多数IDE都可以推断...”。 - TheFuquan

8

这被称为类型提示,在PHP 5中添加。如果你来自像Java这样的语言,它并不完全是你所期望的。它会在你没有传入预期类型时引发错误。但你不能对原始类型进行类型提示(如 int $bur)。


8

#2 : (...) 如果我不在函数内部,如何在PHP中声明变量的类型?

我最近了解了 PHP4 和 5 中的 "settype()" 和 "gettype()", 您可以随时轻松强制转换变量类型。


来自 PHP.net 的说明:

bool settype ( mixed &$var , string $type )

参数

var:要转换的变量。 type:类型的可能值为:

  • "boolean"(或自 PHP 4.2.0 起,"bool")
  • "integer"(或自 PHP 4.2.0 起,"int")
  • "float"(只适用于 PHP 4.2.0 之后的版本,对于旧版本,请使用已弃用的变体 "double")
  • "string"
  • "array"
  • "object"
  • "null"(自 PHP 4.2.0 起)

[ :D 第一次访问,第一次评论...]


是的,我刚看到了。settype和gettype仅适用于原始类型,这并没有帮助(尽管从技术上讲它确实回答了问题,所以我会给你点赞)。请提供PHP文档的链接并将其从您的答案中删除。 - Dan Rosenstark
$myVar = (string) $variabel; 将会得到一个字符串变量。然后,给它赋值。 - Nick Oetjen

3

这是否会对我可以传递给blah方法的变量类型施加任何限制?

这被称为类型提示。根据我刚才链接的PHP文档,是的,它确实对参数类型施加了限制:“未能满足类型提示将导致可捕获的致命错误。”

如果我不在函数中,如何在PHP中声明变量的类型?

阅读类型转换。你无法明确定义PHP变量的类型,其类型由它所使用的上下文决定。


2
@Jeremy Ruten:实际上,“类型提示”的链接已经失效了。 - helle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接