【问题标题】:PHP return typePHP 返回类型
【发布时间】:2011-07-03 12:54:44
【问题描述】:

可以这样定义返回类型吗?

public static function bool Test($value)
{
      return $value; //this value will be bool
}

【问题讨论】:

  • "返回实例化类的接口"?
  • 像 return (bool)$value 一样进行强制转换
  • 请注意,从 PHP 7 开始,有明确的返回类型。查看my answer了解如何操作。

标签: php return return-type


【解决方案1】:

是的,您可以将其转换为 bool

public static function something($value) {
    return (bool)$value;
}

尽管从 PHP 7 开始,您可以显式强制返回类型:

public static function something($value) : bool {
    return $value;
}

【讨论】:

    【解决方案2】:

    PHP 7.0 引入了返回类型声明,所以你可以像下面这样使用:

    public static function Test($value): bool  {
      return $value; //this value will be bool
    }
    

    有关详细信息,请访问官方文档。

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

    https://wiki.php.net/rfc/return_types

    【讨论】:

      【解决方案3】:

      由于这个问题仍然出现在搜索引擎结果中,这里有一个最新的答案:

      PHP 7 实际上按照this RFC 引入了proper return types for functions / methods

      这是上面链接的手册中的示例:

      function sum($a, $b): float {
          return $a + $b;
      }
      

      或者,用更一般的表示法:

      function function_name(): return_type {
          // some code
          return $var // Has to be of type `return_type`
      }
      

      如果返回的变量或值与返回类型不匹配,PHP 会将其隐式转换为该类型。或者,您可以通过declare(strict_types=1); 为文件启用strict typing,在这种情况下,类型不匹配将导致TypeError Exception

      就这么简单。但是,请记住,您需要确保 PHP 7 在您的开发和生产服务器上都可用。

      【讨论】:

      • 人们,请使用它!
      • 我见过一个语法,其中 return_type 看起来像这样:?int 或 ?string .. 问号是什么?
      • @PetruLebada 最近的一项功能,允许将返回类型标记为允许 null 作为值,请参阅 the PHP Doc on Nullable types
      【解决方案4】:

      从 PHP 7.0 开始,您可以像这样声明返回类型:

      function returnABool(): bool {
          return false;
      }
      

      不仅是常见的数据类型,您还可以返回预期的对象实例。例如,您希望一个函数总是返回一个类的实例。可以这样实现:

      class Biography {
          public function name() {
              return 'John Doe';
          }
      }
      

      现在你可以像这样声明这个对象的返回类型:

      function get_bio(): Biography {
          return new Biography();
      }
      

      当函数或方法返回意外的数据类型时,会抛出TypeError。这是一个您会遇到 TypeError 的示例。

      class Biography {
          public function name() {
              return 'John Doe';
          }
      }
      
      class Bio2 {
          public function name() {
              return 'John Doe';
          }
      }
      
      function get_bio(): Biography {
          return new Bio2;
      }
      

      还有一个不会抛出任何TypeError的例子:

      class Biography {
          public function name() {
              return 'John Doe';
          }
      }
      
      class Bio2 {
          public function name() {
              return new Biography();
          }
      }
      
      function get_bio(): Biography {
          $bio2 = new Bio2;
          return $bio2->name();
      }
      

      有关声明函数和方法的返回数据类型的更多详细信息,请参阅official documentation

      【讨论】:

        【解决方案5】:

        自 PHP7 发布以来,他们现在已将 Return Type Declarations 引入 PHP。

        在定义函数时,通过附加: type 来定义返回类型:

        public function foo() : array
        {
            return array();
        }
        

        默认弱模式

        默认情况下,PHP 使用弱模式。文档以下列方式解释它:

        在默认的弱模式下,如果返回的值不属于该类型,则将它们强制转换为正确的类型

        例如,请参阅以下示例,其中函数返回 string,即使定义的返回类型是 int

        function myInt() : int {
            return "1";
        }
        
        echo gettype(myInt());
        // Output is "integer"
        

        强/严格模式

        您还可以通过设置declare(strict_types=1) 来告诉PHP 在处理返回类型时进入严格/强模式。这意味着如果函数返回错误的类型,PHP 将抛出 TypeError。 PHP 文档是这样解释的:

        强模式下,返回值必须是正确的类型,否则会抛出TypeError。

        declare(strict_types=1);
        function myInt() : int {
            return "1";
        }
        
        echo gettype(myInt());
        // Throws an TypeError
        

        【讨论】:

          【解决方案6】:

          根据此页面: http://php.net/manual/en/language.types.type-juggling.php

          你可以试试,

          return (boolean) $value;
          

          现在 PHP 提供来自 PHP 7 的返回类型声明。我已经在 PHP 中解释了 how to use return type

          【讨论】:

            【解决方案7】:

            PHP 7 中添加的返回类型 ;)

            https://wiki.php.net/rfc/return_types

            【讨论】:

              【解决方案8】:

              为了确保覆盖不会更改返回类型,您可以做的另一件事是执行以下操作:

              public function Test($value)
              {
                    return (bool) OnTest();
              }
              
              private function OnTest($value)
              {
                    return $value;
              }
              

              通过这样做,您可以允许从您的类继承的类更改 OnTest 中的功能,但仍确保 Test 返回一个 bool 值。

              【讨论】:

                【解决方案9】:

                目前在 PHP 5 或更低版本中,您可以在函数符号中定义类型,但不能在返回值中定义。 PHP 版本考虑了严格的声明。 6 及以上,但尚未实现。

                也许你可以通过一些技巧来做到这一点,比如在返回值之前进行强制转换......

                【讨论】:

                  【解决方案10】:

                  如果你知道返回值的类型是 bool,那么在函数中强制转换是没有意义的。

                  没有办法在 PHP 中定义函数的返回类型,因为它是松散类型的。您必须在调用函数中进行验证。

                  【讨论】:

                  • bool 类型只是一个例子。
                  • 这并没有使我所说的无效。在函数中将变量转换为自己的类型对您的情况没有帮助。如前所述,您不能为函数指定返回类型,您必须在调用函数中进行验证
                  【解决方案11】:

                  不可能在方法/函数级别显式定义返回类型。如指定的那样,您可以在返回中进行强制转换,例如 ...

                  return (bool)$value;
                  

                  或者,您可以在 phpDoc 语法中添加注释,许多 IDE 将从类型完成的角度来选择类型。

                  /**
                   * example of basic @return usage
                   * @return myObject
                   */
                  function fred()
                  {
                      return new myObject();
                  }
                  

                  【讨论】:

                    【解决方案12】:

                    PHP 不允许您这样做,但您可以这样做:

                    public static function Test($value)
                    {
                          return (bool) $value; //this value will be bool
                    }
                    

                    据我所知,您不能使用接口来强制返回类型

                    【讨论】:

                      猜你喜欢
                      • 2015-12-08
                      • 2012-03-28
                      • 2019-07-03
                      • 1970-01-01
                      • 2016-08-01
                      • 1970-01-01
                      • 2018-10-31
                      • 2016-12-23
                      相关资源
                      最近更新 更多