2009-10-08 2 views
20

일부 언어에서, 당신은 진정한 가치를 발견 할 때까지 왼쪽에서 오른쪽으로 또는 단락 만 값을 평가하는 것입니다가장 왼쪽 값을 반환하는 PHP의 단락 회로가 있습니까?

$a = $b OR $c OR die("no value");

을 할 수 있습니다. 그러나 또한 true이 아닌 을 계산하여 실제 값을 반환합니다. 하나 또는 $a$b 비 거짓 값 인 경우, 상기 예에서

은 PHP에서 $a는 값 1 것, 또는 die을 것이다.

그래서 함수 first

$a 또는 $b 중 하나의을 반환

$a = first($a, $b, die("no value"));

로 사용 썼다. 그러나 단락은 없습니다. 항상 die입니다.

실제 값을 반환하는 PHP에는 OR의 단락 회로가 있습니까?

편집 : 좋은 내가 준 예를 들어 답변,하지만 난 내 예제는 무슨 의미가 정확하지 않습니다 같아요. 내가 분명히하자. 이러한 기능의 각각정말 강렬한 계산을 수행

$a = func1() OR func2() OR func3();

, 그래서 난 단지 대부분에 한 번 각 표현식을 평가합니다. 처음으로 실제 값을 반환하려면 $a에 실제 값을 저장하고 싶습니다.

우리는 단락을 일으키지 않기 때문에 함수 작성을 배제 할 수 있다고 생각합니다. 그리고 조건부 연산자 응답은 각 표현식을 두 번 평가합니다.

+2

물론 이것은 항상 죽을 것입니다. 함수를 호출 할 때 PHP는 먼저 모든 매개 변수를 평가해야합니다. 평가 과정에서 '죽는다'('가치 없음') '을보고 그 일을합니다. – Tom

+1

변수에 대해 이야기 할 때 각 표현식을 두 번 평가하는 것이 좋습니다. 처음으로 질문을 철자하고 처음에는 사용할 수 없었던 추가 정보를 제시 한 후에 대답을 비판하지 않아야합니다. 함수를 의미하는 경우 처음으로 함수를 사용하십시오. 가장 좋은 대답은 혼돈의 "아니오"입니다. –

+1

의견 # 2가 잘못되었습니다. php는 단락 회로 평가를 가지고 있지만 AFAIK는 가장 왼쪽 값을 반환하지 않습니다. 항상 부울을 반환합니다. – apinstein

답변

10

당신은 그냥 사용할 수 있습니다

$a = func1() or $a = func2() or $a = func3(); 

또는 뭔가를 놓치고 있습니까?

+0

정확히 내가 원하는 것은 아니지만 깨끗하고 작동합니다. 감사. – Steve

+16

충분히 깨끗한 "깨끗한"값. – chaos

+3

나는 대답을 upvote 것이다. 그러나 언어를 downvote 할 수 있으면 좋을 것이다. –

28

내 의견으로는, Rasmus Lerdorf가 무능력한 개발자를 방해하는 유능한 개발자를 가장 혼란스럽게 만드는 PHP를 설계 할 때 내린 잘못된 결정 중 하나입니다.

편집 : PHP 5.3 이상에서는 $a = $b ?: $c$a = $b ?: $c ?: $d을 쓸 수 있습니다. 아직 뇌가 손상되지 않은 논리 연산자만큼 좋지는 않지만 뭔가 있습니다.

function coalesce() { 
    foreach (func_get_args() as $arg) { 
     if ($arg) { 
      return $arg; 
     } 
    } 
    return null; 
} 

$a = coalesce($a, $b) or die("no value"); 
+3

? : 구문이 완전히 IMHO입니다. 단락은 비교할 수 없을 정도로 훨씬 우수합니다./ –

+6

저에게서 어떤 주장도 찾을 수 없습니다. – chaos

2

당신은 어떤 coalesce function의 종류를 사용할 수 있을까?

function coalesce($funcs) 
{ 
    foreach ($funcs as $func) 
    { 
     //Catch language constructs 
     switch($func) 
     { 
      case 'die': 
       die(); 
     } 
     $result = $func(); 
     if ($result) 
     { 
      return $result; 
     } 
    } 
} 
+0

이것은 제대로 작동하는 논리 연산자 집합과 완전히 동일하지 않습니다 (복잡한 식이나 함수 호출이 단락되지 않도록하고 오버 헤드가 훨씬 큼).하지만 뭔가 있습니다. – chaos

+1

이것은 좋지만 실제 단락 OR와 달리 병합 할 각 인수를 평가합니다. 예를 들어, coalesce (true, launch_missiles()) 또는 die ("end is near")는 여전히 미사일이 발사되도록합니다. – Shawn

1

어떤 변수 기능에 대해 :

0

이 작동합니다 :

$a = (($f1=func1()) ? $f1 : ($f2=func2()) ? $f2 : func3())); 
1

는 미안하지만이 대답의 대부분은 꺼져 있습니다.

$ a = $ b OR $ c 또는 die ("값 없음");

$a = $b ?: $c ?: die("no value"); 

이유가된다 OR 작동하지 않는 대신 대신에 전자 나 후자의 값을 반환은 true 또는 false를 반환하는 것입니다.