2016-11-14 91 views
1

我在這裏新規範發現:https://wiki.php.net/rfc/void_return_typePHP 7.1中的隱式返回值?

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 – 2016-11-14 01:04:10

回答

3

你可以自己已經很容易地測試這樣的:

function lacks_return(): void { 
} 

function returns_nothing(): void { 
    return; 
} 

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

因此,答案是肯定的 - 有一個隱含的空(NULL)回報,所以你既可以使用一個空的回報或者完全跳過它。哪一種是有道理的 - 什麼都不返回就像沒有返回任何東西一樣?

+4

''var_dump'會比'echo'更好這個例子 –

+0

please also consid呃新的無效類型http://stackoverflow.com/questions/29792827/void-as-return-type。這看起來像主要課程。我真的在尋找一些調試,來自符號表或PHP AST解釋。但這也是很棒的bacuska。 – prosti

+0

@RobbieAverill gettype()返回一個字符串,爲什麼var_dump()是一個字符串? :) –

4

在幕後,PHP checks for return statements in void functions,如果他們指定一個返回值,拋出一個編譯時錯誤:

/* `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 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

因此,編譯時錯誤將防止錯誤的做法返回非'無效',如果函數是'無效'?對? – prosti

+0

這就是主意。 – Andrea