【问题标题】:PHPDoc: @return void necessary?PHPDoc:@return void 有必要吗?
【发布时间】:2011-01-04 21:58:33
【问题描述】:

真的有必要这样做吗:

/**
 * ...
 * 
 * @return void
 */

我有很多方法没有返回值,在评论中放这样的东西似乎真的是多余的。将其排除在外会被认为是不好的形式吗?

【问题讨论】:

    标签: php return-value phpdoc


    【解决方案1】:

    如果它对文档很清楚,则将其保留,但这不是绝对必要的。这是一个完全主观的决定。

    就我个人而言,我会忽略它。

    编辑
    我站得更正了。经过一番谷歌搜索,wikipedia page 说:

    @return [类型描述] 此标记不应用于用于定义为 void 返回类型的构造函数或方法。

    phpdoc.org 网站说:

    @return 数据类型描述
    @return datatype1|datatype2 描述

    @return 标签用于记录函数或方法的返回值。 @returns 是 @return 的别名,用于支持其他自动文档的标签格式

    数据类型应该是有效的 PHP 类型(int、string、bool 等),返回对象类型的类名,或者简单地“混合”。如果您想显式显示多种可能的返回类型,请将它们以竖线分隔且不带空格(例如“@return int|string”)列出。如果在@return 标记中使用类名作为数据类型,phpDocumentor 将自动创建指向该类文档的链接。此外,如果函数返回多个可能的值,请使用 | 分隔它们。字符,并且 phpDocumentor 将解析出返回值中的任何类名。 phpDocumentor 将显示未修改的可选描述。

    Sooo...基于此,我会说离开空白。至少它是非标准的。

    【讨论】:

    • 添加它有什么作用吗?如果您不记录返回类型,我相信 PHPDoc,它会自动假定 void 并将其放入文档中的方法签名中。
    • @Marc W:查看我的编辑。不仅没有必要,也不应该被使用。
    • 自 2010 年以来可能发生了变化,但目前 phpdoc.org 表示:“没有return 值的函数和方法,@return 标记可以在此处省略,在这种情况下,@return 是隐含的。”
    • @TFennis 谢谢。我将按原样保留旧引用,但似乎 phpdoc 只是更能容忍有多少开发人员在使用它。我注意到维基百科页面现在说[需要引用] 关于避免@return void 的声明。
    • 从我的角度来看,这个答案已经过时了。 void 类型自 PHP 7.1 起是有效的返回类型,正如@tivnet 在下面的答案中指出的那样,根据 phpDocumentor,它也是 phpDocs 的有效类型。
    【解决方案2】:

    由于我最近学到了一些东西,我必须编辑我的答案。

    @return void代替@return null有很特殊的含义,考虑下面两个PHP代码示例。

    <?php
    
    /**
     * @return void
     */
    function return_never() {
        echo "foo";
    }
    
    /**
     * @return null|string
     */
    function return_sometimes() {
        if ($this->condition()) {
            return "foo";
        }
    }
    

    在第一个示例中,PHP 将实际返回 NULL,因为 PHP 总是返回 NULL。但是返回的值对调用者没有用,因为它没有说明函数做了什么。 IDE 可以使用 @return void 的文档化信息来指示开发人员使用了一个没有任何用途的返回值。

    <?php
    
    $foo1 = return_never();
    
    $foo2 = return_sometimes();
    

    第一次调用是没有意义的,因为变量总是包含NULL,第二次调用实际上可能包含一些东西。如果我们将函数调用放入条件中,这将变得更加有趣。

    <?php
    
    if (($foo1 = return_never())) {
        // Dead code
        var_dump($foo1);
    }
    
    if (($foo2 = return_sometimes())) {
        var_dump($foo2);
    }
    

    如您所见,@return void 有其用例,应在适用时使用。

    另请注意,它将成为即将发布的 PHP PSR-5 标准的一部分。[1]

    [1]http://www.php-fig.org/psr/

    【讨论】:

    • 好点,但如果函数退出,则意味着它不会返回null。我对吗?我认为,在这种情况下,@returns void 是最好的选择。
    • 如果您不返回任何其他内容,函数将始终返回 NULL。使用exit() 或类似的函数仍会返回NULL,但您不会收到它,因为PHP 会忽略您的代码直接跳转到关闭阶段。
    • 有趣。我会假设,如果你说的是真的,finally 块会在我调用exit 时运行。两者之间没有直接关联,但感觉不对。谢谢你启发我。 :)
    • 更好的措辞应该是:“[...] 仍会返回 NULL [...]”。我想我们可以将exit 与 goto 进行比较,只需告诉 PHP 停止执行当前代码并直接跳转到关闭阶段,忽略从这一点开始的任何代码(因此 goto 在比任何当前函数更外部的范围内 [global]是嵌套的)。 finally 块没有被执行,但许多其他函数被执行(例如register_shutdown__destruct)。
    • 这听起来更有意义,这就是我最初的想法。我还决定使用@returns void 表示该函数终止整个脚本执行,例如在HTTP 重定向中。此外,最好使用它来表示该函数并非旨在返回任何内容。
    【解决方案3】:

    根据 phpDocumentor,@return void 是有效的:

    http://www.phpdoc.org/docs/latest/guides/types.html#keywords

    ... 这种类型通常只在定义返回类型时使用 一种方法或功能。基本定义是元素 用这种类型表示的不包含值,用户应该 不依赖任何检索到的值。

    例如:

     /**
      * @return void
      */
     function outputHello()
     {
         echo 'Hello world';
     }
    

    在上面的示例中,没有指定 return 语句,因此是 返回值未确定。

    来源:http://www.phpdoc.org/docs/latest/for-users/phpdoc/types.html (archived page)。

    【讨论】:

    • 这是我指出“这是正确答案”的地方。 :)
    • 正确答案应该改成这个。
    • 确实这是最好的答案。它也是即将推出的 PSR-5 标准的一部分。我会采用以下语义有意义的编程方法:dereuromark.de/2015/10/05/return-null-vs-return-void
    【解决方案4】:

    以下是我理解和使用 PhpDocumentor 注释的方式:

    <?php
    
    /**
     * This method always returns string.
     * @return string
     */
    public function useCase1()
    {
        return 'foo';
    }
    
    /**
     * This method returns 2 data types so list them both using pipeline separator.
     * @return string|false
     */
    public function useCase2()
    {
        if ($this->foo === 1) {
            return 'foo';
        }
        return false;
    }
    
    /**
     * This method performs some operation and does not return anything so no return
     * annotation is needed.
     */
    public function useCase3()
    {
        $this->doOperation();
        $this->doAnotherOperation();
    }
    
    /**
     * If condition passes method returns void. If condition does not pass it returns
     * nothing so I think that specifying the return annotation with void is in space. :)
     * @return void
     */
    public function useCase4()
    {
        if ($this->foo === 1) {
            $this->doOperation();
            return;
        }
        $this->doAnotherOperation();
    }
    

    【讨论】:

      【解决方案5】:

      从 php 7.1 开始,void is a valid return type 可以在函数上强制执行。

      我会总是将它添加到文档块中。

      编写它的另一个好处是将void 方法与可能返回任何内容但由于疏忽而在文档块上没有@return 条目的方法区分开来。

      【讨论】:

        【解决方案6】:

        就我个人而言,我认为其中缺少的重要一点是记录函数返回非常重要。目前标准没有任何关于永远不会返回的函数的文档....因此 return void 表示是的,这个函数确实返回了。

        考虑这个代码块

        <?php
        
        /**
         * @return void
         */
        function return_void() {
            echo "foo";
        }
        
        /**
         * @return null|string
         */
        function return_sometimes() {
            if ($this->condition()) {
                return "foo";
            }
        }
        
        /**
        * This function actually doesnt return at all - it kills the script
        **/
        function noreturn() {
             //do somthing then
             die(); //or exit()
        }

        显然@return 的使用至少表明函数确实返回

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-22
          • 1970-01-01
          • 2023-01-16
          • 2016-10-03
          • 2012-12-14
          • 1970-01-01
          • 2021-11-11
          • 2016-04-24
          相关资源
          最近更新 更多