2

我在这里找到了新规范:https ://wiki.php.net/rfc/void_return_type

function lacks_return(): void {
    // valid
}
function returns_nothing(): void {
    return; // valid
}
function returns_void(): void {
    return void; // valid
}

问:你知道幕后发生了什么吗?该lacks_return函数实际上会返回void吗?

4

2 回答 2

5

在幕后,PHP检查函数中的return语句void,如果它们指定了返回值,则会引发编译时错误:

/* `return ...;` is illegal in a void function (but `return;` isn't) */
if (return_info->type_hint == IS_VOID) {
    if (expr) {
        if (expr->op_type == IS_CONST && Z_TYPE(expr->u.constant) == IS_NULL) {
            zend_error_noreturn(E_COMPILE_ERROR,
                "A void function must not return a value "
                "(did you mean \"return;\" instead of \"return null;\"?)");
        } else {
            zend_error_noreturn(E_COMPILE_ERROR, "A void function must not return a value");
        }
    }
    /* we don't need run-time check */
    return;
}

否则,void函数的编译会像往常一样工作。return没有值隐式返回NULL

if (!expr_ast) {
    expr_node.op_type = IS_CONST;
    ZVAL_NULL(&expr_node.u.constant);

并且每个函数都在末尾隐式编译return

zend_emit_final_return(0);

其返回值为NULL

zn.op_type = IS_CONST;
if (return_one) {
    ZVAL_LONG(&zn.u.constant, 1);
} else {
    ZVAL_NULL(&zn.u.constant);
}
于 2016-12-04T15:51:23.190 回答
4

你可以很容易地自己测试一下:

function lacks_return(): void {
}

function returns_nothing(): void {
    return;
}

echo gettype(lacks_return()); // NULL
echo gettype(returns_nothing()); // NULL

所以答案是肯定的——有一个隐式的空(null)返回,所以你可以使用一个空的返回或者完全跳过它。哪种有意义 - 什么都不返回与不返回任何东西是一样的?

于 2016-11-14T01:05:49.027 回答