2016-11-14 5 views
1

Ich fand hier in der neuen Spezifikation: https://wiki.php.net/rfc/void_return_typeImplizite Void-Rückgabe in PHP 7.1?

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

Frage: Wissen Sie, was hinter den Kulissen passiert. Wird die lacks_return Funktion tatsächlich void zurückgeben?

+0

'Ist diese Funktion implizit nichtig auch Rückkehr' - ja –

+0

NULL http://ideone.com?/AXErws oder https://3v4l.org/RJRoR –

Antwort

3

du konnte sich ziemlich leicht getestet:

function lacks_return(): void { 
} 

function returns_nothing(): void { 
    return; 
} 

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

So ist die Antwort ja ist - gibt es eine implizite leer (null) zurück, so dass Sie entweder eine leere Rückkehr verwenden könnte oder ganz überspringen. Was macht Sinn - nichts zurückzugeben ist das Gleiche wie nichts zurückzugeben?

+4

'var_dump' wäre besser als' echo' für dieses Beispiel –

+0

Bitte beachten Sie auch äh den neuen void type http://stackoverflow.com/questions/29792827/void-as-return-type. Das sieht nach dem Hauptgericht aus. Ich war wirklich auf der Suche nach etwas Debugging, etwas aus der Symboltabelle oder PHP AST Erklärung. Aber das ist auch eine großartige Bacuska. – prosti

+0

@RobbieAverill gettype() gibt eine Zeichenkette zurück, warum var_dump() eine Zeichenkette? :) –

4

Hinter den Kulissen, PHP checks for return statements in void functions und, wenn sie einen Rückgabewert angeben, wirft einen Fehler bei der Kompilierung:

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

Ansonsten Zusammenstellung von void Funktionen wie normalen funktioniert. return without a value implicitly returns NULL:

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

Und jede Funktion 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

Der Fehler Kompilierzeit verhindert also, dass fehlerhafte Prozeduren nicht 'void' zurückgeben, wenn die Funktion 'void' ist? Recht? – prosti

+0

Das ist die Idee. – Andrea