【问题标题】:Declaring Variable Types in PHP?在 PHP 中声明变量类型?
【发布时间】:2010-09-28 07:16:01
【问题描述】:

I was trying to get my Netbeans to autocomplete with PHP,我了解到这段代码在 PHP 中是有效的:

function blah(Bur $bur) {}

几个问题:

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

【问题讨论】:

    标签: php variable-types


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 完整而出色的答案。我承认我的主要重点是让我的 IDE 提示,我已经在这里找到了 stackoverflow.com/questions/390192... 就个人而言,我发现 PHP 的许多方面都令人沮丧,但这只是我对类型化语言的偏好。
    • 在那里,即使是我们这些不喜欢强类型语言的人也同意你的看法:)
    • PHP 的一个好的步骤是选择声明类型或使其保持动态。我希望在未来的 PHP 中看到这一点
    • 我有点不同意或想要更精确地进行第一次编辑:null 永远不是有效类型 $myClass (PHP 5.3)。也许它可以作为默认参数,但如果使用函数签名中的类型提示,仍然无法将其传递(就像在 Java 中一样)。
    • 其实可以声明myFunc(MyClass $x = NULL),然后调用myFunc(NULL)或者myFunc()就不会报错了。
    【解决方案2】:
    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 cmets 来输入。

    【讨论】:

    • 如果我不上课怎么办? $variable 来自一个包含的 PHP...我想我几乎到了我需要的地方...
    • 无需测试。根据 PHP 文档,“未能满足类型提示会导致可捕获的致命错误。” ch2.php.net/language.oop5.typehinting
    • 我确认,它与 eclipse PDT 完美配合,感谢“大多数 IDE 可以推断...”的提及。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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


      来自 PHP.net:

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

      参数

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

      • “boolean”(或者,自 PHP 4.2.0 起,“bool”)
      • “整数”(或者,自 PHP 4.2.0 起,“整数”)
      • “float”(仅在 PHP 4.2.0 之后才有可能,旧版本使用已弃用的变体“double”)
      • “字符串”
      • “数组”
      • “对象”
      • “null”(PHP 4.2.0 起)

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

      【讨论】:

      • 是的,我刚刚看到了。 settype 和 gettype 仅适用于原语,这没有帮助(尽管从技术上讲它确实回答了这个问题,所以我会投票给你。请提供 PHP 文档的链接并将其从你的答案中删除)。
      • $myVar=(string) $variabel; 给出一个字符串变量。然后,分配一个值。
      【解决方案5】:

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

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

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

      阅读type juggling。你不能在 PHP 中显式定义变量的类型,它的类型是由它所使用的上下文决定的。

      【讨论】:

      • @Jeremy Ruten:实际上指向type hinting 的链接已损坏。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      相关资源
      最近更新 更多