2016-11-14 7 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 –

답변

3

당신은 자신을 아주 쉽게 테스트 할 수 :

function lacks_return(): void { 
} 

function returns_nothing(): void { 
    return; 
} 

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

그래서 대답은 - 당신이 빈 반환을 사용하거나 완전히 건너 뛸 수있는 하나 있도록 암시 빈 (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 설명에서 뭔가 찾고 있었다. 그러나 이것은 또한 위대한 bacuska입니다. – prosti

+0

@RobbieAverill gettype()은 문자열을 반환합니다. 왜 var_dump()는 문자열입니까? :) –

4
장면 뒤에

, PHP checks for return statements in void functions하고, 컴파일 타임 오류가 발생합니다. return without a value implicitly returns NULL : is compiled with an implicit return at the end

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

그리고 모든 기능 :

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