2011-01-09 7 views
0
의 변수를 재 할당

나는 원 사업자에 질문을 살펴본/다른 구조 경우, 나는 정상적인 상황에서 이상 삼항 연산자를 사용에는 성능 손실/이득이 없다는 것을 이해하면서 if/else 구조체들, 나는이 상황에 대한 언급을 보지 못했다. PHP 특정 언어 (그러나 어떤 언어 무신론자 자세한 환영) 인터프리터는이 같은 상황에서 값을 다시 할당 않습니다삼항 연산자와 PHP

$foo = 'bar' 
$foo = strlen($foo) > 3 ? substr($foo, 0, 3) : $foo; 

을이 $foo = $foo;이 비효율적이다, 또는 인터프리터가 단순히이 평가를 폐기/간과 않습니다에 평가하는 것 때문에 ?

!defined('SECURE') ? exit : null; 
+1

내 대답은 내 대답의 숫자에서 내 얼굴이 붉어지고 있습니다. – BoltClock

답변

4

첫 번째 예는 비효율적 인 경우 나도 몰라,하지만 확실히 무의미 :에 대해 어떻게 보조 노트에

. 문이 있다면 여전히 생각 명확 :
$foo = 'bar'; 

if (strlen($foo) > 3) 
    $foo = substr($foo, 0, 3); 

다음과 같은 작품을하는 동안, 그것은 삼항 연산자는 식/값을 평가하는 데 사용되는 것을 의미하기 때문에 마지막에 null을 배치 할 말이 없다

, 그러나 여기 null or 조건식로 평가되므로,

더 일반적으로
!defined('SECURE') ? exit : null; 

, 당신이 볼 것, 부울 단락의 예 (SECURE가 정의되어있는 경우 or exit가 실행되지 않습니다 구문 분석 오류를 방지하는 것 외에는 아무것도하지 않는다 진실한 au tomatically 한 번에 적어도 하나 개의 조건이) 사실로 발견된다 :

defined('SECURE') or exit; 

내가 만들려고 요점은 이것이다 : 삼항 조건식 단지 당신이 할 수 있기 때문에 사용하지 마십시오. 여기에 원을 사용하는 것이/

+0

감사합니다 ** BoltClock **; 분명히 분명하다. 나는 그런 상황에 대해 삼항 연산자를 사용할 때 왜 세 번째 표현식이 필요한지 궁금해했습니다. 아마 나는 혼자지만'$ foo = strlen ($ foo)> 3? substr ($ foo, 0, 3);'나는 매우 읽을 수있는 것 같습니다. 불리언 단락이 다시 여기서 답이 될 것입니다, 맞습니까? – Dan

+0

@TomcatExodus : 대부분의 사람들은'또는 죽을 줄'에 대한 단락 회로를 예약합니다. 실제적인 죽음의 위협처럼 들린다. :) – BoltClock

+0

하하, 물론. 필자가 지적한 첫 번째 시나리오는 내 자신의 코드 리팩터링을위한 것이고 두 번째 시나리오는 동료를위한 것입니다. 그는 뷰 파일을 직접 액세스로부터 보호하기 위해'! defined ... '를 사용했고, 완전한'if'조건은 내가 생각하기에 너무 장황하게 보였다. 내가 그 대답을 받아 들였지만, PHP 인터프리터에서'$ foo = $ foo; '와 같은 값을 재 할당하는 것에 대한 생각은 무엇입니까? – Dan

0

, 나는 BoltClock가 제시 한 양식을 사용 최적이 아닙니다. 이미 위에서 다뤘습니다. 값을 재 할당할지 여부에 대해 질문을 드리겠습니다 :

이것은 "재 할당"이라고하는 것에 따라 다릅니다. PHP는 최적화하지 않으므로 $foo = $foo이 평가됩니다. 반면에 이것은 PHP가 $foo의 값을 새로운 메모리 덩어리로 복사하는 것을 의미하지는 않습니다. 아마 PHP는 $foorefcount을 증가시키고 즉시 감소시킬 것입니다. (자기 할당의 정확한 구현 세부 사항에 대해서는 잘 모르겠지만) 아마. 따라서 PHP가 명령문을 실행하더라도 성능에 영향을 미치지 않습니다 (코드에 $foo = $foo을 700 만 번 쓰지 않는 한).

0

주제 :

if (strlen($foo) > 3) { 
    $foo = substr($foo, 0, 3); 
} 

PHP는 아직이 경우에 작동하는 것이 더 간단한 무언가를 구현하지 않습니다이 경우

+0

응답 해 주셔서 감사합니다 ** nikic **; 브라우저로 렌더링하는 스크립트의 경우 일반적으로 가능한 한 효율적으로 유지하고 요청에서 응답까지의 논리 경로를 최적화합니다 (캐시 메커니즘 등을 통해). 그러나 필자는 때로는 CLI 기반의 스크립트에 PHP를 사용하여 복잡하고 높은 반복 프로세스 (편의상 Perl로 전환하지 않았으므로)를 수행합니다. 그 이유는 바로 제가 궁금했던 이유입니다. (7 백만은 높지만 확실히 드문 일이 아닙니다.) – Dan

+0

그런 경우에도 할당을 최적화하는 것은 비 효과적입니다. 예를 들어'issrl ($ foo [3])'에 의해'strlen' 체크를 대체함으로써 훨씬 많은 것을 얻을 수 있습니다 :) – NikiC

0

@BoltClock이 말한대로 항상 단락이 있지만 if 문은 제 의견으로는 더 읽기 쉽고 else ifelse 문도 열립니다.

strlen($foo) > 3 && $foo = substr($foo, 0, 3); 

후자의 명령문은 이전 값이 TRUE 인 경우에만 실행됩니다.