[php] PHP 평등 (== double equals)과 항등 (=== triple equals) 비교 연산자는 어떻게 다릅니 까?

차이점은 무엇이며 ==그리고 ===?

  • 느슨한 ==비교 가 정확히 어떻게 작동합니까?
  • 엄격한 ===비교 는 정확히 어떻게 작동합니까?

유용한 예는 무엇입니까?



답변

차이 사이 =====

느슨하게 ==동등한 연산자와 엄격한 ===동일한 연산자 의 차이점 은 매뉴얼에 정확하게 설명되어 있습니다 .

비교 연산자

┌───────────┬───────────┬─────────────────────────── ──────────────────────────────────┐
│ 예 │ 이름 │ 결과 │
├───────────┼───────────┼─────────────────────────── ──────────────────────────────────┤
│ $ a == $ b │ 같음 │ 저글링 유형 후 $ a가 $ b와 같으면 참입니다. │
│ $ a === $ b │ 동일 │ $ a가 $ b와 같고 유형이 같으면 참. │
└───────────┴───────────┴─────────────────────────── ──────────────────────────────────┘

느슨하게 ==동일한 비교

당신이 사용하는 경우 ==운영자, 또는 느슨하게 비교를 사용하는 다른 비교 연산자를 같은 !=, <>또는 ==, 당신은 항상보고있는 상황 뭔가가 무슨 일이 일어나고 있는지 이해로 변환됩니다 왜, 무엇을 볼 수 있습니다.

규칙 변환

타입 비교표

참조 및 예제로 매뉴얼 에서 비교 테이블을 볼 수 있습니다 .

와의 느슨한 비교 ==

┌─────────┬┬──────┬┬──────┬───────┬───────┬──────── ┬───────┬───────┬───────┬───────┬─────────┬──────── ┬───────┐
│ │ TRUE │ FALSE │ 1 │ 0 │ -1 │ "1"│ "0"│ "-1"│ NULL │ array () │ "php"│ ""│
├─────────┼┼──────┼┼──────┼───────┼───────┼──────── ┼───────┼───────┼───────┼───────┼─────────┼──────── ┼───────┤
│ 참 │ 참 │ 거짓 │ 참 │ 거짓 │ 참 │ 참 │ 거짓 │ 참 │ 거짓 │ 거짓 │ 참 │ 거짓 │
│ FALSE │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ TRUE │ TRUE │ FALSE │ TRUE │
│ 1 │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │
│ 0 │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ TRUE │ TRUE │
│ -1 │ True │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │
│ "1"│ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │
│ "0"│ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │
│ "-1"│ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │
│ NULL │ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ FALSE │ TRUE │
│ array () │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ TRUE │ FALSE │ FALSE │
│ "php"│ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │
│ ""│ FALSE │ TRUE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ TRUE │
└─────────┴┴──────┴┴──────┴───────┴───────┴──────── ┴───────┴───────┴───────┴───────┴─────────┴──────── ┴───────┘

엄격한 ===동일한 비교

당신이 사용하는 경우 ===와 같은 엄격한 비교를 사용하는 운영자, 또는 다른 비교 연산자 !==또는 ===, 당신은 항상 확인 유형하지 않을 수 있습니다 마술 변경을, 어떤 변환에 가고 없을 것 때문이다. 따라서 엄격한 비교를 통해 유형과 값은 값뿐만 아니라 동일해야합니다.

타입 비교표

참조 및 예제로 매뉴얼 에서 비교 테이블을 볼 수 있습니다 .

다음과의 엄격한 비교 ===

┌─────────┬┬──────┬┬──────┬───────┬───────┬──────── ┬───────┬───────┬───────┬───────┬─────────┬──────── ┬───────┐
│ │ TRUE │ FALSE │ 1 │ 0 │ -1 │ "1"│ "0"│ "-1"│ NULL │ array () │ "php"│ ""│
├─────────┼┼──────┼┼──────┼───────┼───────┼──────── ┼───────┼───────┼───────┼───────┼─────────┼──────── ┼───────┤
│ TRUE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │
│ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ 거짓
│ 1 │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │
│ 0 │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │
│ -1 │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │
│ "1"│ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │
│ "0"│ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │
│ "-1"│ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │
│ NULL │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │ FALSE │
│ array () │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │ FALSE │
│ "php"│ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │ FALSE │
│ ""│ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ TRUE │
└─────────┴┴──────┴┴──────┴───────┴───────┴──────── ┴───────┴───────┴───────┴───────┴─────────┴──────── ┴───────┘

답변

== 연산자는 서로 다른 두 유형이 다른 경우 캐스트하지만 === 연산자는 ‘유형 안전 비교’를 수행합니다. 즉, 두 피연산자가 동일한 유형과 동일한 값을 갖는 경우에만 true를 리턴합니다.

예 :

1 === 1: true
1 == 1: true
1 === "1": false // 1 is an integer, "1" is a string
1 == "1": true // "1" gets casted to an integer, which is 1
"foo" === "foo": true // both operands are strings and have the same value

경고 : 동등한 멤버를 가진 같은 클래스의 두 인스턴스가 ===연산자 와 일치하지 않습니다 . 예:

$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b); // bool(false)


답변

그림은 천 단어의 가치가 있습니다.

PHP Double Equals ==평등 차트 :

여기에 이미지 설명을 입력하십시오

PHP Triple Equals ===Equal 차트 :

여기에 이미지 설명을 입력하십시오

이러한 이미지를 생성하는 소스 코드 :

https://github.com/sentientmachine/php_equality_charts

전문가 명상

정신 건강을 유지하고자하는 사람들은 PHP의 광기가 아닌 부분이 설계된 방식이라고 말하는 것 외에는 아무런 의미가 없기 때문에 더 이상 읽을 필요가 없습니다.

  1. NAN != NAN하지만 NAN == true.
  2. ==left가 숫자 인 경우 왼쪽 및 오른쪽 피연산자를 숫자로 변환합니다. 그래서 123 == "123foo"하지만,"123" != "123foo"
  3. 따옴표로 묶은 16 진 문자열은 때로는 부동 소수점이며, 의지에 따라 부동으로 던져져 런타임 오류가 발생합니다.

  4. ==하지 이적 때문에 "0"== 0, 그리고 0 == ""있지만,"0" != ""

  5. 아직 선언되지 않은 PHP 변수는 PHP에 정의되지 않은 변수를 나타내는 방법이 있지만이 기능은로 비활성화되어 ==있습니다.
  6. "6" == " 6", "4.2" == "4.20"그리고 "133" == "0133"그러나 133 != 0133. 그러나 "0x10" == "16""1e3" == "1000"진수에 깜짝 문자열 변환을 노출시키는 런타임 오류가 발생, 사용자의 명령 또는 동의없이 모두 발생합니다.

  7. False == 0, "", []"0".

  8. 숫자가 충분히 크면 == 무한대입니다.

  9. 새로운 클래스는 ==에서 1입니다.

  10. False는 대부분의 다른 변수에 대해 ==이기 때문에 False가 가장 위험한 값이며 대부분 목적을 무시합니다.

기대:

PHP를 사용하는 경우 double equals 연산자를 사용하지 않아야합니다. triple equals를 사용하는 경우 걱정해야 할 유일한 경우는 NAN과 숫자가 무한대에 가깝기 때문에 무한대로 캐스트되기 때문입니다. 더블 이퀄라이저를 사용하면 무엇이든 놀라게 ==할 수 있고 또는 의지와!= 분명히 동등한 무언가에 .

==PHP에서 사용하는 곳 은 브라운 모션으로 프로그래밍하는 수백만 명의 프로그래머가 설계 한 암시 적 캐스팅 규칙에 의해 노출 된 85 개의 버그로 인해 코드 냄새가 심합니다.


답변

JavaScript와 관련하여 :

=== 연산자는 == 연산자와 동일하게 작동하지만 피연산자가 동일한 값뿐만 아니라 동일한 데이터 유형을 가져야합니다.

예를 들어 아래 샘플은 ‘x와 y는 동일합니다’를 표시하지만 ‘x와 y는 동일하지 않습니다’를 표시합니다.

var x = 4;
var y = '4';
if (x == y) {
    alert('x and y are equal');
}
if (x === y) {
    alert('x and y are identical');
}


답변

객체 비교에 관한 다른 답변에 추가 :

==는 객체의 이름과 값을 사용하여 객체를 비교합니다. 두 객체의 유형이 동일하고 구성원 값이 동일한 경우$a == $b true를 생성합니다.

=== 객체의 내부 객체 ID를 비교합니다. 멤버가 같더라도 $a !== $b정확히 동일한 객체가 아닌 경우

class TestClassA {
    public $a;
}

class TestClassB {
    public $a;
}

$a1 = new TestClassA();
$a2 = new TestClassA();
$b = new TestClassB();

$a1->a = 10;
$a2->a = 10;
$b->a = 10;

$a1 == $a1;
$a1 == $a2;  // Same members
$a1 != $b;   // Different classes

$a1 === $a1;
$a1 !== $a2; // Not the same object


답변

가장 간단한 용어로 :

== 동등한 지 확인 (값만)

=== 동일한 지 확인 (값 && 유형)

항목과 같은 항목을 확인합니다.

1 + 1 = 2 + 0 (상당)

1 + 1 = 1 + 1 (동일)

PHP에서 :

참 == 1 ( 값이 동일 함)

true === 1 (false-&& 유형에서 동일하지 않음)

  • 사실은 부울
  • 1은 정수입니다

답변

데이터 유형에 관한 것입니다. 테이크 BOOL예를 들어 (true 또는 false)를 :

true또한 동일 1
false도 같다0

==비교하는 데이터 유형에 대해 상관하지 않는다 : 당신은 (또한이 될 수있는 1 인 변수를 가지고 그래서 경우 true) :

$var=1;

그리고 다음과 비교하십시오 ==.

if ($var == true)
{
    echo"var is true";
}

그러나 $var실제로 같지 true않습니까? 1대신 int 값이 있으며 이는 true입니다.

=== 데이터 유형을 검사하여 두 변수 / 객체 / 무엇이 같은 유형을 사용하는지 확인합니다.

내가 한 경우

if ($var === true)
{
    echo "var is true";
}

그 조건은 사실이 아니기 때문에 사실 $var !== true이 아닙니다.== true (당신이 무슨 뜻인지 알고있는 경우).

왜 이것이 필요할까요?

간단 함-PHP의 기능 중 하나를 보자 : array_search() :

array_search()함수는 단순히 배열에서 값을 검색하고 값을 찾은 요소의 키를 반환합니다. 배열에서 값을 찾을 수 없으면 false를 반환합니다 . 그러나 배열array_search()첫 번째 요소 (배열 키가있는 0) 에 저장된 값을 켜면 어떻게 될까요?array_search() 함수는 0을 반환합니다 … 이것은 false와 같습니다.

그래서 당신이 한 경우 :

$arr = array("name");
if (array_search("name", $arr) == false)
{
    // This would return 0 (the key of the element the val was found
    // in), but because we're using ==, we'll think the function
    // actually returned false...when it didn't.
}

그렇다면 지금 이것이 어떻게 문제가 될 수 있습니까?

대부분의 사람들은 == false함수가 false를 반환하는지 확인할 때 사용하지 않습니다 . 대신에을 사용합니다 !. 그러나 실제로 이것은을 사용하는 것과 정확히 동일 ==false합니다.

$arr = array("name");
if (!array_search("name", $arr)) // This is the same as doing (array_search("name", $arr) == false)

따라서 이와 같은 경우 ===대신 데이터 유형을 확인하도록 대신 사용하십시오 .