2016-11-14 10 views
1

は、私はここに新しい仕様で見つかった:https://wiki.php.net/rfc/void_return_typePHP 7.1での暗黙のvoidリターン?

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

確認する:あなたはシーンの背後に何が起こるか知っていますか。 lacks_return関数は実際にはvoidを返しますか?

+0

は 'も暗黙の空白を返すこの機能は' - はい –

+0

NULL http://ideone.com/AXErwsまたはhttps://3v4l.org/RJRoR –

答えて

3

あなたはかなり簡単に自分でこれをテストしている可能性:

function lacks_return(): void { 
} 

function returns_nothing(): void { 
    return; 
} 

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

をだから、答えはイエスです - あなたは空の戻りを使用するか、それを完全にスキップすることができいずれかのように、暗黙の空(ヌル)のリターンがあります。どのような意味がありますか - 何も返さないことは何も返さないことと同じですか?

/* `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機能のコンパイルは通常のように動作します:彼らは、戻り値を指定した場合

+4

この例では 'var_dump'は' echo'よりも優れています –

+0

もお考えください新しいvoid型http://stackoverflow.com/questions/29792827/void-as-return-type。これはメインコースのようです。私は実際に、シンボルテーブルやPHP ASTの説明からデバッグを探していました。しかしこれは素晴らしいバカスカです。 – prosti

+0

@RobbieAverill gettype()は文字列を返します。なぜvar_dump()の文字列ですか? :) –

4
舞台裏

、PHP checks for return statements in void functionsとは、コンパイル時にエラーがスローされます。 return without a value implicitly returns NULL

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

、すべての機能is compiled with an implicit return at the end

zend_emit_final_return(0); 

Whose return value is NULL:?

zn.op_type = IS_CONST; 
if (return_one) { 
    ZVAL_LONG(&zn.u.constant, 1); 
} else { 
    ZVAL_NULL(&zn.u.constant); 
} 
+0

コンパイル時エラーは、関数が 'void'の場合、' void'を返さない悪い習慣を防ぐでしょうか?右? – prosti

+0

それは考えです。 – Andrea

関連する問題