54

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

function blah(Bur $bur) {}

几个问题:

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

5 回答 5

78

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

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

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

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

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

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

编辑:您还可以使用 PHP 5.1 起的“数组”,以及 PHP 5.4 起的“可调用”。

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

于 2008-12-24T19:36:28.680 回答
39
  1. 如果您传递一个不属于该类型的值,则为函数参数指定数据类型将导致 PHP 抛出一个可捕获的致命错误。但请注意,您只能为类指定类型,而不能为字符串或整数等原语指定类型。
  2. 如果提供了 PHPDoc 样式注释,大多数 IDE 都可以推断出数据类型。例如

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

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

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

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

于 2008-12-24T07:04:35.530 回答
8

它被称为类型提示,是 PHP 5 中添加的。如果您来自 Java 之类的语言,这可能不是您所期望的。如果您没有传入预期的类型,它确实会引发错误。但是,您不能键入提示原语(没有 int $bur)。

于 2008-12-24T07:03:15.613 回答
7

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

我最近听说PHP4 & 5 中的“ settype() ”和“ gettype()
” 你可以随时轻松地强制变量类型


来自 PHP.net:

bool settype ( 混合 &$var , 字符串 $type )

参数

var : 被转换的变量。type :类型的可能值是:

  • "boolean" (或者,从 PHP 4.2.0 开始,"bool")
  • “整数”(或者,自 PHP 4.2.0 起,“整数”)
  • "float" (只有 PHP 4.2.0 以后才有可能,对于旧版本使用不推荐使用的变体 "double")
  • “细绳”
  • “大批”
  • “目的”
  • "null" (PHP 4.2.0 起)

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

于 2008-12-24T14:46:39.343 回答
3

这实际上对我可以传递给 blah 方法的变量类型有任何限制吗?

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

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

阅读类型杂耍。您不能在 PHP 中显式定义变量的类型,它的类型由使用它的上下文决定。

于 2008-12-24T07:10:22.103 回答