2011-11-07 3 views
7

제 목표는 if() 문에 복잡한 논리를 넣는 것입니다. 배열에 값이 배열되어 있고 배열의 모든 항목이 0이 아닌 경우 약간의 코드를 실행한다고 가정 해 보겠습니다. 일반적으로 $valid = true, foreach 내 배열이라고 할 수 있으며 0이 발견되면 $valid = false을 설정합니다. 그런 다음 내 코드 if ($valid)을 실행합니다. 또는 내 루프를 함수에 넣고 함수를 내 if()에 넣을 수도 있습니다.IF 문에서 PHP 클로저가 반환하는 것은 무엇입니까?

그러나 나는 게으르다. 그래서 나는 "유효한"플래그를 잔뜩 들고 싶지 않고 한 곳에서만 사용되는 완전히 새로운 기능을 쓰지 않을 것이다. 나는 if이 true로 평가되는 'foo'를 얻을 것으로 기대하고 있었다

if ($q = function() { return 'foo'; }) { 
    echo $q; 
} 
else { 
    echo 'false'; 
} 

:

그래서 말을하자 나는이 있습니다. 내 클로저는 $q으로 커밋되고 문이 실행됩니다. $q은 문자열 foo을 반환하고 'foo'가 인쇄됩니다.

대신 Object of class Closure could not be converted to string이 표시됩니다.

그럼 대신 해보자 : 내 기능은 거짓과 '사실'이 인쇄 될 것입니다 반환 것이라고 예상하고 있었다

if (function() { return false; }) { 
    echo 'foo'; 
} 
else { 
    echo 'true'; 
} 

. 대신 'foo'가 인쇄됩니다.

내가이 문제에 대해 어떻게 생각하니? 그것은 말하고있는 것처럼 보입니다. "네, 확실히 기능입니다!" "No"대신에 "false"로 평가 되었기 때문입니다. 내가하려는 일을 할 수있는 방법이 있습니까?

+3

함수와 반환 값을 혼동하는 것처럼 보입니다. – delnan

+0

필자가 원했던 것은 if (function() {return false;}()) {{}가 자바 스크립트에서는 유효하지만 PHP에서는 유효하지 않다고 가정합니다. – ajp5103

+0

http://stackoverflow.com/questions/3568410/anonymous-functions-that-execute-immediately call_user_func()는 내가 찾고있는 것입니다. – ajp5103

답변

4

function() { return false; } 다른 클래스 유형 new에 유사한 유형 Closure의 객체를 생성은 다음 코드를 비교 $func은 이제 개체입니다. 각 개체는 if 절에서 true를 반환합니다. 그래서

if ($func) 
{ 
    # true 
} else { 
    # will never go here. 
} 

는 대신이 작업을 수행 할 수 있습니다 : 폐쇄 개체 $func를 호출하고 반환 값의 줄 것이다

if ($func()) 
{ 
    # true 
} else { 
    # false 
} 

합니다.

echo $q(); 
3

두 가지 모두 사실로 평가됩니다.

if 문에서 사용하려면 함수를 실행해야합니다.

이 시도 :

데모
$q = function() { return false; }; 
if ($q()) { //should not go here. 
    echo $q(); 
} 
else { 
    echo 'false'; 
} 

:

$func = function() { return false; }; 

: http://codepad.viper-7.com/Osym1s

1

당신은 따라서 폐쇄가 아닌 폐쇄의 결과를 출력하려고, 폐쇄를 실행하지 않는 . $q = function() { return 'foo'; }을 테스트 할 때 "$ q가이 익명 함수에 대한 참조를 할당하고 $ q가 null이 아니면이 테스트를 통과합니다"(PHP가 재미 있지 않습니까?)

닫히고 결과를 $q에 할당하고 테스트하기 전에 $q을 반향 출력합니다.

0

당신은 익명 함수를 작성하지만, 그것을 실행되지 않습니다 : 당신이 echo를 호출 할 때

2

PHP의 클로저는 Closure의 해킹 객체로 구현됩니다. 코드는 실제로이 클래스의 객체를 인스턴스화하여 $ q에 할당합니다. PHP에서 할당 결과는 할당 된 값이므로 사실상 코드는 아래로 내려갑니다.

if (new Closure()) { ... }