Nice programing

1234 == '1234 test'가 참으로 평가되는 이유는 무엇입니까?

nicepro 2020. 10. 6. 19:05
반응형

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

반응형