PHPDoc: @return void cần thiết?


81

Có thực sự cần thiết phải làm điều gì đó như thế này không:

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

Tôi có khá nhiều phương thức không có giá trị trả về và có vẻ như thực sự thừa khi đặt một cái gì đó như thế này trong nhận xét. Bỏ nó ra có bị coi là hình thức xấu không?

Câu trả lời:


91

Nếu nó làm cho tài liệu rõ ràng, thì hãy để nó vào, nhưng nó không hoàn toàn cần thiết. Đó là một quyết định hoàn toàn chủ quan.

Cá nhân, tôi sẽ bỏ nó ra.

CHỈNH SỬA
Tôi đứng đã sửa. Sau một chút googling, trang wikipedia cho biết:

@return [type description] Không nên sử dụng thẻ này cho các hàm tạo hoặc các phương thức được xác định với kiểu trả về void.

Trang web phpdoc.org cho biết:

@return datatype description
@return datatype1 | datatype2 description

Thẻ @return được sử dụng để ghi lại giá trị trả về của các hàm hoặc phương thức. @returns là bí danh của @return để hỗ trợ các định dạng thẻ của các trình tài liệu tự động khác

Kiểu dữ liệu phải là kiểu PHP hợp lệ (int, string, bool, v.v.), tên lớp cho kiểu đối tượng được trả về hoặc đơn giản là "hỗn hợp". Nếu bạn muốn hiển thị rõ ràng nhiều kiểu trả về có thể, hãy liệt kê chúng được phân cách bằng dấu sổ đứng không có dấu cách (ví dụ: "@return int | string"). Nếu tên lớp được sử dụng làm kiểu dữ liệu trong thẻ @return, phpDocumentor sẽ tự động tạo liên kết đến tài liệu của lớp đó. Ngoài ra, nếu một hàm trả về nhiều giá trị có thể, hãy phân tách chúng bằng cách sử dụng | và phpDocumentor sẽ phân tích cú pháp bất kỳ tên lớp nào trong giá trị trả về. phpDocumentor sẽ hiển thị mô tả tùy chọn chưa được sửa đổi.

Sooo ... Dựa vào đó, tôi sẽ nói rằng hãy bỏ đi khoảng trống. Nó không phải là tiêu chuẩn, ít nhất.


Thêm nó thậm chí làm bất cứ điều gì? Tôi tin tưởng vào PHPDoc nếu bạn không ghi lại kiểu trả về thì nó sẽ tự động giả định voidvà đặt nó vào chữ ký phương thức trong tài liệu.
Marc W

@Marc W: xem bản chỉnh sửa của tôi. không chỉ là nó không cần thiết, nó không được cho là được sử dụng.
Jonathan Fingland

2
Có thể đã thay đổi kể từ năm 2010 nhưng hiện tại phpdoc.org cho biết: "các hàm và phương thức không có returngiá trị, thẻ @return CÓ THỂ bị bỏ qua ở đây, trong trường hợp đó, @return void được ngụ ý."
TFennis 17/12/13

@TFennis Cảm ơn. Tôi sẽ để nguyên phần trích dẫn cũ, nhưng có vẻ như phpdoc chỉ đơn giản là khoan dung hơn với số lượng nhà phát triển đang sử dụng nó. Tôi nhận thấy trang wikipedia hiện đang nói [cần dẫn nguồn] cho tuyên bố về việc tránh @return void.
Jonathan Fingland

Theo quan điểm của tôi, câu trả lời này đã lỗi thời. Kiểu voidnày là vì PHP 7.1 là kiểu trả về hợp lệ và như @tivnet chỉ ra trong câu trả lời bên dưới, nó cũng là kiểu hợp lệ cho phpDocs theo phpDocumentor.
Ernesto Allely

50

Theo phpDocumentor, @return void hợp lệ:

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

... kiểu này thường chỉ được sử dụng khi xác định kiểu trả về của một phương thức hoặc hàm. Định nghĩa cơ bản là phần tử được chỉ ra với kiểu này không chứa giá trị và người dùng không nên dựa vào bất kỳ giá trị được truy xuất nào.

Ví dụ:

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

Trong ví dụ trên, không có câu lệnh trả về nào được chỉ định và do đó giá trị trả về không được xác định.

Nguồn: http://www.phpdoc.org/docs/latest/for-users/phpdoc/types.html ( trang lưu trữ ).


4
Đây là nơi tôi chỉ ra rằng 'đây là câu trả lời chính xác'. :)
Typo

3
Câu trả lời đúng nên được thay đổi thành này.
BadHorsie

4
Quả thực đây sẽ là câu trả lời tốt nhất ở đây. Nó cũng là một phần của tiêu chuẩn PSR-5 sắp ra đời. Tôi sẽ đi theo phương pháp sau để lập trình có ý nghĩa ngữ nghĩa: dereuromark.de/2015/10/05/return-null-vs-return-void
đánh dấu

15

Tôi phải chỉnh sửa câu trả lời của mình vì một số điều tôi đã học được gần đây.

Sử dụng @return voidthay vì @return nullcó một ý nghĩa rất đặc biệt, hãy xem xét hai ví dụ sau về mã PHP.

<?php

/**
 * @return void
 */
function return_never() {
    echo "foo";
}

/**
 * @return null|string
 */
function return_sometimes() {
    if ($this->condition()) {
        return "foo";
    }
}

Trong ví dụ đầu tiên, PHP thực sự sẽ trả về NULL, vì PHP luôn trả về NULL. Nhưng giá trị trả về không có ích gì cho người gọi vì nó không nói gì về những gì hàm đã làm. IDE có thể sử dụng thông tin dạng văn bản @return voidđể chỉ ra cho nhà phát triển biết rằng giá trị trả về được sử dụng không phục vụ mục đích nào.

<?php

$foo1 = return_never();

$foo2 = return_sometimes();

Lần gọi đầu tiên là vô nghĩa vì biến sẽ luôn chứa NULL, lệnh thứ hai có thể thực sự chứa một cái gì đó. Điều này thậm chí còn trở nên thú vị hơn nếu chúng ta đặt các lời gọi hàm vào một điều kiện.

<?php

if (($foo1 = return_never())) {
    // Dead code
    var_dump($foo1);
}

if (($foo2 = return_sometimes())) {
    var_dump($foo2);
}

Như bạn thấy, @return voidcó các trường hợp sử dụng của nó và nên được sử dụng nếu có.

Cũng lưu ý rằng nó sẽ là một phần của chuẩn PHP PSR-5 sắp tới. [1]

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


Điểm tốt, nhưng nếu hàm thoát ra, có nghĩa là nó không quay trở lại null. Tôi nói đúng chứ? Tôi nghĩ, trong trường hợp đó @returns voidlà lựa chọn tốt nhất.
Tamás Barta

Một hàm sẽ luôn trả về NULLnếu bạn không trả về bất kỳ thứ gì khác. Một hàm sử dụng exit()hoặc bất cứ thứ gì tương tự như thế này vẫn trả về NULLnhưng bạn sẽ không nhận được nó vì PHP trực tiếp chuyển sang giai đoạn tắt bỏ qua mã của bạn.
Fleshgrinder

Hấp dẫn. Tôi đã giả định rằng, nếu những gì bạn nói là đúng, finallycác khối sẽ chạy khi tôi gọi exit. Không phải là mối tương quan trực tiếp giữa hai người, nhưng nó cảm thấy không ổn. Cảm ơn vì đã khai sáng cho tôi. :)
Tamás Barta

Một từ ngữ tốt hơn sẽ là: “[…] sẽ vẫn quay trở lại NULL[…]”. Tôi đoán chúng ta có thể so sánh exitvới goto bằng cách chỉ cần yêu cầu PHP ngừng thực thi mã hiện tại và trực tiếp chuyển sang giai đoạn tắt máy, bỏ qua bất kỳ mã nào từ thời điểm này trở đi (do đó goto trong phạm vi bên ngoài [toàn cầu] hơn bất kỳ hàm hiện tại nào được lồng vào nhau) . Một khối finally không được thực hiện, nhưng nhiều chức năng khác (ví dụ register_shutdown, __destruct).
Fleshgrinder

Điều đó nghe có vẻ có ý nghĩa hơn, và đó là những gì tôi nghĩ lúc đầu. Tôi cũng quyết định sử dụng @returns voidđể chỉ ra rằng hàm chấm dứt toàn bộ quá trình thực thi tập lệnh, ví dụ như trong chuyển hướng HTTP. Ngoài ra, vẫn sẽ tốt hơn nếu sử dụng để chỉ ra rằng hàm không được thiết kế để trả về bất kỳ thứ gì.
Tamás Barta

7

Kể từ php 7.1, voidlà kiểu trả về hợp lệcó thể được thực thi trên một hàm.

Tôi sẽ luôn thêm nó vào docblock.

Một lợi ích khác của việc viết nó là phân biệt các voidphương thức với các phương thức có thể trả về bất kỳ thứ gì nhưng không có @returnmục nhập trên docblock do sơ suất.


3

Đây là cách tôi hiểu và sử dụng chú thích 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();
}

0

Cá nhân tôi nghĩ rằng điều quan trọng còn thiếu ở đây là việc ghi lại một hàm trả về là điều quan trọng. Hiện tại các tiêu chuẩn không có bất kỳ tài liệu nào cho các hàm không bao giờ trả về .... do đó, một khoảng trống trả về là cách nói có hàm này thực sự trả về.

Xem xét khối mã này

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

Rõ ràng việc sử dụng @return ít nhất cho thấy hàm không trả về

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.