Неявный возврат пустоты в PHP 7.1?

Я нашел здесь новую спецификацию: 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?


person prosti    schedule 14.11.2016    source источник
comment
Is this function also returning implicit void? - да   -  person scrowler    schedule 14.11.2016
comment
NULL ideone.com/AXErws или 3v4l.org/RJRoR   -  person    schedule 14.11.2016


Ответы (2)


Вы могли бы легко проверить это сами:

function lacks_return(): void {
}

function returns_nothing(): void {
    return;
}

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

Так что ответ да - существует неявный пустой (нулевой) возврат, поэтому вы можете либо использовать пустой возврат, либо полностью пропустить его. Какой смысл - ничего не возвращать - это то же самое, что ничего не возвращать?

person Denis Mysenko    schedule 14.11.2016

За кулисами 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);
}
person Andrea    schedule 04.12.2016
comment
Таким образом, ошибка времени компиляции предотвратит возврат неправильных практик, отличных от void, если функция void? Верно? - person prosti; 04.12.2016