1234 == '1234 test'가 참으로 평가되는 이유는 무엇입니까? [복제]
중복 가능성 :
php == vs === 연산자
내가 확신하는 누군가를위한 쉬운 대답. 누군가이 표현이 사실로 평가되는 이유를 설명 할 수 있습니까?
(1234 == '1234 test')
== (유사성) 연산자를 사용하고 있고 PHP가 문자열을 int로 강제하고 있기 때문입니다.
이 문제를 해결하려면 === (같음) 연산자를 사용하여 값이 동일한 지뿐만 아니라 데이터 유형이 동일한 지 확인하므로 "123"문자열과 123 int가 같지 않은 것으로 간주됩니다.
PHP (및 약간 다른 동작을하는 JavaScript)에서 비교 연산자 ==
는 C 또는 Java와 같은 강력한 형식의 언어 에서와는 다르게 작동합니다. ===
연산자를 사용하면 가장 가능성이 기대하는 행동이있다. 아래는 PHP에 적용되는 두 가지 비교 연산자를 분석 한 것입니다.
==
이 연산자는 "equality"라는 단어의 일반적인 정의에 실제로 맞지 않지만 공식적으로 "equality"연산자로 알려져 있습니다. 유형 저글링 비교 라고 하는 작업을 수행 합니다. 두 피연산자의 유형이 일치하지 않는 경우 (예에서 1234
정수이고 1234 test
문자열 인 경우) PHP는 피연산자를 서로의 유형으로 암시 적으로 캐스트하고 아래와 같이 새로 입력 된 값의 동일성을 테스트합니다.
<?php
var_dump( (int) 'hi' ); // int(0)
var_dump( (string) 0 ); //string("0")
var_dump( 'hi' == 0 ); // bool(true)
var_dump( (int) '1hi' ); // int(1)
var_dump( 1 == '1hi' ); // bool(true)
대응하는 (유형 저글링) 부등식 연산자 !=
.
===
===
"동일한"연산자로 알려진 이 연산자 는 두 피연산자 의 값 과 유형에 대해 엄격한 검사를 수행하고 암시 적 캐스트를 수행하지 않습니다. 따라서, "0"
하지 않습니다 === 0
및 "1234 test"
하지 않습니다 === 1234
.
<?php
var_dump( '1234 test' === 1234 ); // bool(false)
대응하는 (엄격한) 부등식 연산자 !==
.
퀴크
점을 유의 ===
운영자가 일부에 의해 이상한 생각된다 객체에 대한 행동을 가지고있다. class A
및 변수가 $a
있고 $b
아래에 정의되어 있다고 가정 합니다.
<?php
class A {
public $property = 'default value';
}
$a = new A();
$b = new A();
var_dump($a === $b);
출력을 기대할 수 있습니다 bool(true)
. 실제로 false를 반환합니다. 객체에 사용될 때 연산자는 실제로 두 피연산자가 동일한 객체에 대한 참조인지 확인 합니다 . 이 경우 ==
연산자는 객체의 속성을 확인하여 작동하므로 $a == $b
.
PHP 매뉴얼 링크
문자열을 정수로 캐스트 할 때 숫자가 아닌 첫 번째 문자까지의 모든 숫자가 숫자가됩니다. 따라서 공백은 숫자 '1234 test'
가 1234
아니기 때문입니다.
그러므로 1234 == '1234 test'
문자열 비교를 강제하려면 문자열로 캐스트해야합니다.
''.(1234) == '1234 test' // implicit
(string) 1234 == '1234 test' // explicit
strval(1234) == '1234 test' // procedural
두 가지 유형의 데이터 (정수 및 문자열)를 느슨하게 비교하고 있습니다. PHP는 느슨한 비교 이항 연산자 (==)를 사용할 때 시스템에서 비교가 작동하는 방식에 대한 매우 상세한 차트를 제공합니다.
http://php.net/manual/en/types.comparisons.php
유형도 동기화되어 있는지, 즉 둘 다 정수 또는 두 문자열인지 확인하려면 강력한 유형 비교 연산자 (===)를 사용하십시오.
이 연산자를 사용하면 false도 반환됩니다.
1234 === '1234'
비교할 때 유형이 확실하지 않은 경우 강력한 유형 비교와 PHP 유형 변환을 결합 할 수 있습니다.
$a = 1234;
$b = '1234';
if ($a === $b) { } // Will not fire, as it is false
if ((int)$a === (int)$b) { } // Will fire, as it is true
double equals는 문자열에서 int를 구문 분석하도록 PHP에 지시합니다. 문자열은 정수 1234로 평가됩니다. 정확한 비교를 얻으려면 triple equals '==='를 사용하십시오.
If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically
var_dump(0 == "a"); // 0 == 0 -> true
참고URL : https://stackoverflow.com/questions/12151997/why-does-1234-1234-test-evaluate-to-true
'Nice programing' 카테고리의 다른 글
Android에서 String.isEmpty ()를 호출 할 수 없습니다. (0) | 2020.10.06 |
---|---|
비 유형 템플릿 매개 변수 (0) | 2020.10.06 |
(iOS 7 출시 이후) PC / Mac에서 iTunes를 사용하지 않고 UDID를 얻을 수있는 방법이 있습니까? (0) | 2020.10.06 |
Windows에서 npm을 어떻게 업데이트합니까? (0) | 2020.10.06 |
특정 ID 값에 따른 MySQL 순서 (0) | 2020.10.06 |