2014-09-24 4 views
24

while (true)while (\true)의 차이점 가장 중요한 것은 booleanPHP의 네임 스페이스의 영향을받는 이유를 분명히 알 수 있습니까?`while (true)`와`while ( true)`의 차이점은 무엇입니까?

+7

https://github.com/igorw/retry/issues/3 - *"이 기능은 이미 조금 나아졌지만, 맨 위에는 다소 비효율적 인 FETCH_CONSTANT 명령이 있습니다. 이것은 FETCH_CONSTANT 호출을 없애고 부울을 true 인라인으로 만듭니다. "* –

+2

'("true "를 while (\ true)로 바꿈으로써이를 최적화 할 수 있습니다. TRUE/FALSE'는 다른 상수와 같이 동작합니다. http://php.net/manual/en/reserved.constants.php –

+4

모든 함수/클래스/변수/상수/etc는 버전 5.3.0부터 PHP에서 이름 공간으로 사용되고 true/false/null/etc는 여러분이 정의 할 수있는 상수처럼 상수입니다 ... 대부분은 전역 네임 스페이스에 있지만 PHP는 현재 네임 스페이스를 먼저 확인한 다음 글로벌 네임 스페이스를 확인합니다 현재 네임 스페이스에서 그 (것)들을 찾지 않는다. 그래서 그'\'접두어를 사용하면 현재 네임 스페이스 체크의 오버 헤드를 막을 수있다. –

답변

55

PHP true에서 falsenull은 네임 스페이스에서 덮어 쓰지 않도록 보호되는 상수입니다. 예를 들면되어 다음과 같은 유효하지 않은 코드로 : 그것은 수도 (

namespace Foo; 
define('Foo\true', false); 
var_dump(true); // bool(false) 

을 그러나이 지원되지 않는 기능 :

그것은 여전히 ​​가능
namespace Foo; 
const true = false; // Cannot redeclare constant 'true' 

는 일정한 사용 '()를 정의' '를 덮어 버그라고 부름) PHP는 true을 덮어 쓸 수 없다고 가정 할 수 있습니다.

// Note: This uses eval() to make sure the define() runs before the constexpr 
//  constant resolution happens 

namespace Foo; 
define('Foo\true', false); 
var_dump(eval('namespace Foo; 
static $t = true; 
return $t;')); // bool(true) 

대체가 constexpr의 경우가 아니라 "정상"경우에 발생하는 이유는 구현에 버그가

하십시오 constexpr의 맥락에서 true의 사용 예를 들어 위의 정의에 의해 영향을받지 않습니다 . constexprs의 경우 대체는 이름 확인 전에 수행되지만 일반 코드의 경우 이름 확인 후에 수행됩니다.

올바른 구현은 이름 확인 후 항상 대체하지만 대체 중에 true, falsenull을 특히 고려해야합니다. "PHP 7에서이 문제를 해결할 계획입니다.

+31

+1 for * PHP 7에서이 문제를 해결할 계획입니다 * – ircmaxell

+3

PHP 따옴표 7 따옴표. – Jimbo

+1

@tftd 냉소적인지는 알 수 없습니다. PHP 7이 차기 버전의 PHP라는 것을 알고 있습니까? 우리는 6을 건너 뛰고 있습니다. – mpen

관련 문제