PHPDoc : @return void가 필요합니까?


81

다음과 같이 정말 필요한가요?

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

반환 값이없는 메서드가 꽤 많이 있으며 주석에 이와 같은 것을 넣는 것이 정말 중복되어 보입니다. 그것을 생략하는 것이 나쁜 형태로 간주됩니까?

답변:


91

문서가 명확하다면 그대로 두십시오. 그러나 반드시 필요한 것은 아닙니다. 전적으로 주관적인 결정입니다.

개인적으로는 생략하겠습니다.

편집
내가 수정되었습니다. 인터넷 검색을 한 후 위키 백과 페이지에 다음과 같이 표시됩니다.

@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

@Marc W : 내 편집을 참조하십시오. 필요하지 않을뿐만 아니라 사용해서는 안됩니다.
Jonathan Fingland

2
2010 년 이후로 변경되었을 수 있지만 현재 phpdoc.org에서는 " return값이 없는 함수 및 메서드 , @return 태그를 여기서 생략 할 수 있으며,이 경우 @return void가 암시됩니다."라고 말합니다.
TFennis

@TFennis 감사합니다. 레거시 인용문은 그대로 두겠습니다 만, phpdoc은 단순히 얼마나 많은 개발자들이 그것을 사용하고 있는지에 대해 더 관대 해 보입니다. 나는 위키피디아 페이지에서 @return void.
Jonathan Fingland

내 관점에서이 대답은 구식입니다. 유형 void은 PHP 7.1 이후 유효한 반환 유형이며 @tivnet이 아래 답변에서 가리 키므로 phpDocumentor에 따라 phpDocs에 대한 유효한 유형이기도합니다.
Ernesto Allely

50

phpDocumentor에 따르면 @return void가 유효합니다.

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

...이 유형은 일반적으로 메서드 또는 함수의 반환 유형을 정의 할 때만 사용됩니다. 기본 정의는이 유형으로 표시된 요소가 값을 포함하지 않으며 사용자가 검색된 값에 의존해서는 안된다는 것입니다.

예를 들면 :

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

위의 예에서는 반환 문이 지정되지 않았으므로 반환 값이 결정되지 않았습니다.

출처 : http://www.phpdoc.org/docs/latest/for-users/phpdoc/types.html ( 아카이브 페이지 ).


4
이것이 제가 '이것이 정답입니다'라고 지적하는 곳입니다. :)
Typo 2013 년

3
정답은 이것으로 변경되어야합니다.
BadHorsie

4
실제로 이것이 가장 좋은 대답이 될 것입니다. 또한 곧 출시 될 PSR-5 표준의 일부입니다. 의미 론적 의미있는 프로그래밍을 위해 다음 접근 방식을 사용합니다 : dereuromark.de/2015/10/05/return-null-vs-return-void
mark

15

최근에 배운 내용 때문에 답을 수정해야합니다.

@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항상을 반환하기 때문에 실제로 반환 합니다 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에 최선의 선택 이라고 생각 합니다.
Tamás Barta 2014 년

NULL다른 것을 반환하지 않으면 함수는 항상 반환 됩니다. exit()또는 이와 비슷한 것을 사용하는 함수 는 여전히 반환 NULL되지만 PHP가 코드를 무시하고 종료 단계로 직접 점프하기 때문에 수신하지 않습니다.
Fleshgrinder

흥미 롭군. 나는 당신이 말한 것이 사실이라면 finally내가 전화 할 때 블록이 실행 된다고 가정 했을 것 exit입니다. 둘 사이의 직접적인 상관 관계는 아니지만 옳다고 생각하지 않습니다. 계몽 해주셔서 감사합니다. :)
Tamás Barta 2014 년

더 나은 표현은 "[…]가 여전히 NULL[…]를 반환 할 것 입니다."입니다. exit현재 코드 실행을 중지하고 종료 단계로 바로 이동하고이 시점부터 모든 코드를 무시하도록 간단히 PHP에 지시하여 goto와 비교할 수 있다고 생각 합니다 (따라서 현재 함수가 중첩 된 것보다 더 외부 범위 [global]에있는 goto). . 최종적으로 블록이 실행되지 않고, 많은 다른 기능 (예이다 register_shutdown, __destruct).
Fleshgrinder 2014 년

그게 더 의미가있는 것 같고 처음에 그렇게 생각했습니다. 또한 @returns void함수가 HTTP 리디렉션과 같이 전체 스크립트 실행을 종료 함을 나타내는 데 사용하기로 결정했습니다 . 또한 함수가 아무것도 반환하도록 설계되지 않았 음을 나타내는 데 사용하는 것이 더 좋습니다.
Tamás Barta 2014 년

7

PHP 7.1부터는 void유효한 반환 유형 이며 함수에 적용 할 수 있습니다.

나는 항상 그것을 docblock에 추가 할 것 입니다.

그것을 작성하는 또 다른 이점은 void아무 것도 반환 할 수 있지만 @return과실로 docblock에 항목 이없는 메서드 와 메서드 를 구별하는 것 입니다.


3

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();
}

1

개인적으로 여기에서 누락 된 큰 점은 함수 반환을 문서화하는 것이 중요하다는 것입니다. 현재 표준에는 절대 반환하지 않는 함수에 대한 문서가 없습니다. 따라서 반환 무효는이 함수가 실제로 반환하는 예를 말하는 방법입니다.

이 코드 블록을 고려하십시오.

<?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을 사용하면 적어도 함수가 반환한다는 것을 나타냅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.