PHPDoc: @return void необхідний?


81

Чи справді потрібно робити щось подібне:

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

У мене є досить багато методів, які не мають поверненого значення, і здається справді зайвим додавати щось подібне до коментаря. Чи вважатимемо це поганою формою, якщо це не помітити?

Відповіді:


91

Якщо це чітко пояснює документацію, залиште це, але це не є суворо необхідним. Це цілком суб’єктивне рішення.

Особисто я б це залишив поза увагою.

EDIT
Я стою виправлений. Трохи погугливши, на сторінці Вікіпедії сказано:

@return [опис типу] Цей тег не повинен використовуватися для конструкторів або методів, визначених з типом повернення void.

На веб-сайті phpdoc.org сказано:

@return datatype description
@return datatype1 | datatype2 description

Тег @return використовується для документування поверненого значення функцій або методів. @returns - це псевдонім для @return для підтримки форматів тегів інших автоматичних документаторів

Тип даних повинен бути дійсним типом PHP (int, string, bool тощо), назвою класу для типу поверненого об'єкта або просто "змішаним". Якщо ви хочете явно показати декілька можливих типів повернення, перелічіть їх, розділені лініями без пробілів (наприклад, "@return int | string"). Якщо ім'я класу використовується як тип даних у тезі @return, phpDocumentor автоматично створить посилання на документацію цього класу. Крім того, якщо функція повертає кілька можливих значень, розділіть їх за допомогою | символ, а phpDocumentor проаналізує будь-які імена класів у поверненому значенні. phpDocumentor відобразить необов’язковий опис у незміненому вигляді.

Оооо ... Виходячи з цього, я б сказав, залишити порожнечу. Це принаймні нестандартно.


Чи додавання цього взагалі щось робить? Я вірю в PHPDoc, якщо ви не задокументуєте тип повернення, який він автоматично передбачає, voidі поміщає його в підпис методу в документах.
Marc W

@Marc W: див. Мою редакцію. мало того, що це не потрібно, це не передбачається використовувати.
Джонатан Фінгленд,

2
Можливо, змінилися з 2010 року, але в даний час phpdoc.org каже: "функції та методи без returnзначення, тег @return МОЖЕ бути тут опущений, і в цьому випадку мається на увазі @return void".
TFennis

@TFennis Дякую. Залишаю застарілу цитату як є, але, схоже, phpdoc просто більш терпимо ставиться до того, скільки розробників її використовували. Я помічаю, що на сторінці wikipedia зараз говориться [потрібне цитування] для заяви про уникнення @return void.
Джонатан Фінгленд,

З моєї точки зору, ця відповідь застаріла. Тип void, оскільки PHP 7.1 є дійсним типом повернення, і як @tivnet вказує у відповіді нижче, це також допустимий тип для phpDocs згідно з phpDocumentor.
Ернесто Аллелі

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
Тут я вказую, що "це правильна відповідь". :)
Друкарська помилка

3
Правильну відповідь слід змінити на це.
BadHorsie

4
Дійсно, це була б найкраща відповідь тут. Він також є частиною стандарту PSR-5, який виходить. Я б запропонував такий підхід до змістовного змісту програмування: dereuromark.de/2015/10/05/return-null-vs-return-void
позначка

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, оскільки 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це найкращий варіант.
Tamás Barta

Функція завжди повертається, NULLякщо ви не повертаєте нічого іншого. Функція, яка використовує exit()або щось подібне, все ще повертається, NULLале ви не отримаєте її, оскільки PHP безпосередньо переходить до фази вимкнення, ігноруючи ваш код.
Fleshgrinder

Цікаво. Я б припустив, що якщо те, що ви говорите, відповідає дійсності, finallyблоки запускаються, коли я дзвоню exit. Не є прямим співвідношенням між ними, але це не здається правильним. Дякую, що просвітлив мене. :)
Tamás Barta

Кращим формулюванням було б: «[…] все одно поверне NULL[…]». Я думаю, ми можемо порівняти exitз goto, просто сказавши PHP припинити виконання поточного коду та безпосередньо перейти до фази вимкнення, ігноруючи будь-який код з цього моменту (таким чином goto в більш зовнішній області [глобальної], ніж будь-яка поточна функція вкладена) . Блок нарешті не виконується, але багато інших функцій (наприклад register_shutdown, __destruct).
Fleshgrinder

Це звучить більш зрозуміло, і це те, про що я думав спочатку. Я також вирішив використовувати, @returns voidщоб вказати, що функція припиняє виконання всього сценарію, наприклад, у перенаправленні HTTP. Також було б краще використовувати, щоб вказати, що функція не призначена для повернення будь-чого.
Tamás Barta

7

Станом на php 7.1, voidє дійсним типом повернення і може бути застосовано до функції.

Я завжди додавав би це на блок-блок.

Ще однією перевагою його написання є диференціація voidметодів від методів, які можуть повертати що-небудь, але не мають @returnзаписів на блоці даних через недбалість.


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

Особисто я думаю, що найбільшого, чого не вистачає в цьому, є те, що документування функції, яку взагалі повертає, є важливим. В даний час стандарти не мають жодної документації щодо функцій, які ніколи не повертаються .... отже, повернення 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 принаймні вказує на те, що функція повертається

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.