programing

PHP 등호(== 이중 등호)와 아이덴티티(=== 삼중 등호) 비교 연산자는 어떻게 다릅니까?

copysource 2022. 10. 31. 23:43
반응형

PHP 등호(== 이중 등호)와 아이덴티티(=== 삼중 등호) 비교 연산자는 어떻게 다릅니까?

== ★★★★★★★★★★★★★★★★★」===

  • lossuly는 정확히 입니까?==★★★★★★★★★★★★★★★★★★?
  • 정확히 어떻게 엄밀히 말하면===★★★★★★★★★★★★★★★★★★?

어떤 유용한 예가 있을까요?

★★★의 차이== ★★★★★★★★★★★★★★★★★」===

'''의 차이== equal equal " strict"===동일한 조작자가 설명서에 정확하게 설명되어 있습니다.

비교 연산자

┌──────────┬───────────┬───────────────────────────────────────────────────────────┐"예" "이름" "결과"├──────────┼───────────┼───────────────────────────────────────────────────────────┤타입 저글링 후 $a가 $b일 경우 $a == $b equal Equal true TRUE입니다.$a === $b identical $a가 $b이고 같은 유형이면 동일한 true TRUE입니다.└──────────┴───────────┴───────────────────────────────────────────────────────────┘

==

「 」를하고 있는 는,==, operator operator operator operator operator 와 같이 느슨하게 비교를 사용하는 다른 !=,<> ""==어떤 일이 일어나고 있는지 이해하기 위해 어떤 것이 무엇, 어디서, 왜 변환되는지를 보기 위해 항상 문맥을 살펴봐야 합니다.

규칙 변환

유형 비교표

참조 및 예로 설명서에서 비교 표를 볼 수 있습니다.

와의 가 느슨하다==

┌─────────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬─────────┬───────┬───────┐TRUE false FALSE 1 1 、 0 、 1 、 1 、 0 、 - 1 、 NULL array array() " " " " " "├─────────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─────────┼───────┼───────┤TRUE │ TRUE │ FALSE │ TRUE │ TRUE │ TRUE │ FALSE │ FALSE │ TRUE │ TRUE │ TRUE │ TRUE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │ FALSE │FALSE 、 FALSE 、 TRUE 、 TRUE 、 FALSE 、 FALSE 、 TRUE 、 TRUE 、 TRUE 、 FALSE 、 TRUE 、 FALSE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE▲ 1 ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE▲ 0 ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ TRUE ▲ TRUE ▲ TRUE ▲ TRUE ▲ TRUE ▲ TRUE ▲ TRUE ▲ TRUE ▲ TRUE ▲ TRUE ▲ TRUE- - 1 、 TRUE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 。▲ 1 ▲ TRUE ▲ FALSE ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ 0 ▲ TRUE ▲ FALSE ▲ TRUE ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE【-1】【TRUE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】│ NULL 、 FALSE 、 TRUE 、 TRUE 、 FALSE 、 FALSE 、 FALSE 、 TRUE 、 FALSE 、 TRUE 、 FALSE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE 、 TRUE │ TRUE 、 TRUE │ TRUE 、 TRUE 、 TRUE 、 TRUE array() │ FALSE 、 TRUE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 TRUE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 。▲ "php" ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE 【"】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】└─────────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴─────────┴───────┴───────┘

깐깐한 깐깐한 깐깐한 .=== 비교

「 」를하고 있는 는,=== 또는 하는 다른 !== ""===변환이 진행되지 않기 때문에 유형이 마법처럼 변경되지 않도록 항상 확인할 수 있습니다.따라서 엄밀한 비교에서는 값뿐만 아니라 유형과 값이 동일해야 합니다.

유형 비교표

참조 및 예로 설명서에서 비교 표를 볼 수 있습니다.

★★★와의 ===

┌─────────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬─────────┬───────┬───────┐TRUE false FALSE 1 1 、 0 、 1 、 1 、 0 、 - 1 、 NULL array array() " " " " " "├─────────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼─────────┼───────┼───────┤▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE▲ 1 ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE▲ 0 ▲ FALSE ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE- - 1 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE )▲ 1 ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ★▲ 0 ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE【-1】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】【FALSE】│ NULL 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 。array() 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 TRUE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 。▲ 'php' ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ TRUE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲ FALSE ▲" " " FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 FALSE 、 TRUE 。└─────────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴─────────┴───────┴───────┘

연산자 ==는 서로 다른 두 가지 유형을 캐스팅하고, === 연산자는 'typesafe 비교'를 수행합니다.즉, 두 오퍼랜드의 유형과 값이 동일한 경우에만 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 = PHP 중중 php 。==식식: :

여기에 이미지 설명 입력

은 PHP와 동일합니다.===식식: :

여기에 이미지 설명 입력

다음 이미지를 만드는 소스 코드:

https://github.com/sentientmachine/php_equality_charts

구루 명상

제정신을 유지하고 싶은 사람은 더 이상 읽지 마십시오. 왜냐하면 PHP의 광기-프랙탈이 이렇게 설계되었다는 것 외에는 이 중 어느 것도 말이 되지 않기 때문입니다.

  1. NAN != NANNAN == true.

  2. ==왼쪽이 숫자일 경우 왼쪽 및 오른쪽 피연산자가 숫자로 변환됩니다. ★★★★★★★★★★★★★★★★★.123 == "123foo""123" != "123foo"

  3. 따옴표로 둘러싸인 16진수 문자열은 때때로 플로트일 수 있으며, 뜻에 반하여 플로트되어 런타임 오류가 발생합니다.

  4. ==이 없습니다."0"== 0 , , , , 입니다.0 == """0" != ""

  5. 않은 변수를 이은 PHP false로 되어 있습니다.PHP는 정의되지 않은 변수를 나타내는 방법을 가지고 있지만, 이 기능은==.

  6. "6" == " 6","4.2" == "4.20" , , , , 입니다."133" == "0133"133 != 0133"0x10" == "16" ★★★★★★★★★★★★★★★★★」"1e3" == "1000"이 깜짝 문자열의 8진수 변환이 지시 또는 동의 없이 발생하여 런타임 오류가 발생합니다.

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

  8. 에 1을 되고 있는 않고 "1"로 됩니다.infinity.

  9. 신규 클래스는 == 대 1입니다.

  10. False가 가장 위험한 값인 이유는 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참된 결과입니다.

===자신의 아이디 '네'는 '네'가 아니라 '네'는 '네'입니다.$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

중요한 것은 데이터 타입입니다.BOOL false (true "false")

true 하다1 ★★★★★★★★★★★★★★★★★」false 하다0

==에서는 비교 시 데이터 타입은 신경 쓰지 않습니다. 변수가('1'이 될도 있습니다).true

$var=1;

에 '해 주세요', '비교하다', '비교하다',==:

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

★★★★★★★★★★★★★★★★★.$var는 하지 않다truevalue ? value of value value of of of of of of of of of of of of of of of of of of ?1대신, 그것은 곧 진실과 같다.

★★★★★★★★★★★★★★★★ ===데이터 타입이 체크되어 2개의 변수/변수/무엇이 같은 타입을 사용하고 있는지 확인합니다.

그래서 만약 내가 그랬다면

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

이다.$var !== true밖에 없다== true(이것들?)

왜 이런 게 필요하죠?

PHP의 중 .- PHP - PHP の : simple simple simple simple simple simple simple simple simple simple simple simple simple simple 。array_search():

array_search()함수는 배열에서 값을 검색하고 값이 발견된 요소의 키를 반환합니다.배열에서 값을 찾을 수 없으면 false를 반환합니다.하지만, 만약 당신이 그 일을array_search()배열의 번째 요소에 저장된 값(배열 키 포함)0 )......array_search()0으로 하다거짓과 같죠

그렇다면 다음과 같이 하십시오.

$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어,어,어,어,어,어,어,어,어,어,어,어,어,어,어.

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

이런 할 는 '우리끼리'를 요.===대신 데이터 유형이 확인되도록 합니다.

= PHP Double = PHP 중중 php 。==:

대부분의 프로그래밍 언어에서 비교 연산자(==)는 데이터 유형과 변수의 내용이 동일한지 확인합니다.PHP의 표준 비교 연산자(==)는 다르게 동작합니다.비교 전에 두 변수를 동일한 데이터 유형으로 변환한 다음 두 변수의 내용이 동일한지 여부만 확인합니다.다음과 같은 결과를 얻을 수 있습니다.

<?php
    var_dump( 1 == 1 );     // true
    var_dump( 1 == '1' );   // true
    var_dump( 1 == 2 );     // false
    var_dump( 1 == '2' );   // false
    var_dump( 1 == true );  // true
    var_dump( 1 == false ); // false
?>

은 PHP와 동일합니다.===:

이 연산자는 변수의 데이터 유형도 확인하고 두 변수의 내용과 데이터 유형이 동일한 경우에만 true를 반환합니다.따라서 다음 사항이 정확합니다.

<?php
    var_dump( 1 === 1 );     // true
    var_dump( 1 === '1' );   // false
    var_dump( 1 === 2 );     // false
    var_dump( 1 === '2' );   // false
    var_dump( 1 === true );  // false
    var_dump( 1 === false ); // false
?>

자세한 내용은 PHP에서 ==와 ===의 차이점을 참조하십시오.

===를 사용하여 함수 또는 변수가 false(0 또는 빈 문자열)와 동일하지 않고 false인지 여부를 테스트할 수 있습니다.

$needle = 'a';
$haystack = 'abc';
$pos = strpos($haystack, $needle);
if ($pos === false) {
    echo $needle . ' was not found in ' . $haystack;
} else {
    echo $needle . ' was found in ' . $haystack . ' at location ' . $pos;
}

이 경우 strpos는 0을 반환하며 이는 테스트에서 false에 해당합니다.

if ($pos == false)

아니면

if (!$pos)

그건 네가 원하는 게 아니야

변수에는 유형과 값이 있습니다.

  • $var = "test"는 "test"를 포함하는 문자열입니다.
  • $var2 = 24는 vhose 정수값 24입니다.

(PHP에서) 이러한 변수를 사용하면 적절한 유형이 없을 수 있습니다.예를 들어 다음과 같은 경우

if ($var == 1) {... do something ...}

PHP는 $var를 정수로 변환해야 합니다("캐스트로").이 경우 공백이 아닌 문자열이 1로 캐스트되기 때문에 "$var == 1"이 참입니다.

===를 사용할 때 AND TYPE 값이 동일한지 확인하므로 "$var === 1"은(는) false입니다.

예를 들어 false(오류 발생 시)와 0(결과)을 반환할 수 있는 함수가 있는 경우 유용합니다.

if(myFunction() == false) { ... error on myFunction ... }

는 마치 '오류'처럼 있습니다.myFunction()0을 나타내다올바른 코드는 다음과 같습니다.

if(myFunction() === false) { ... error on myFunction ... }

이 테스트는 반환값이 "부울 값이며 false"이며 "false로 캐스팅할 수 있다"는 것이 아니기 때문입니다.

<?php

    /**
     * Comparison of two PHP objects                         ==     ===
     * Checks for
     * 1. References                                         yes    yes
     * 2. Instances with matching attributes and its values  yes    no
     * 3. Instances with different attributes                yes    no
     **/

    // There is no need to worry about comparing visibility of property or
    // method, because it will be the same whenever an object instance is
    // created, however visibility of an object can be modified during run
    // time using ReflectionClass()
    // http://php.net/manual/en/reflectionproperty.setaccessible.php
    //
    class Foo
    {
        public $foobar = 1;

        public function createNewProperty($name, $value)
        {
            $this->{$name} = $value;
        }
    }

    class Bar
    {
    }
    // 1. Object handles or references
    // Is an object a reference to itself or a clone or totally a different object?
    //
    //   ==  true   Name of two objects are same, for example, Foo() and Foo()
    //   ==  false  Name of two objects are different, for example, Foo() and Bar()
    //   === true   ID of two objects are same, for example, 1 and 1
    //   === false  ID of two objects are different, for example, 1 and 2

    echo "1. Object handles or references (both == and    ===) <br />";

    $bar = new Foo();    // New object Foo() created
    $bar2 = new Foo();   // New object Foo() created
    $baz = clone $bar;   // Object Foo() cloned
    $qux = $bar;         // Object Foo() referenced
    $norf = new Bar();   // New object Bar() created
    echo "bar";
    var_dump($bar);
    echo "baz";
    var_dump($baz);
    echo "qux";
    var_dump($qux);
    echo "bar2";
    var_dump($bar2);
    echo "norf";
    var_dump($norf);

    // Clone: == true and === false
    echo '$bar == $bar2';
    var_dump($bar == $bar2); // true

    echo '$bar === $bar2';
    var_dump($bar === $bar2); // false

    echo '$bar == $baz';
    var_dump($bar == $baz); // true

    echo '$bar === $baz';
    var_dump($bar === $baz); // false

    // Object reference: == true and === true
    echo '$bar == $qux';
    var_dump($bar == $qux); // true

    echo '$bar === $qux';
    var_dump($bar === $qux); // true

    // Two different objects: == false and === false
    echo '$bar == $norf';
    var_dump($bar == $norf); // false

    echo '$bar === $norf';
    var_dump($bar === $norf); // false

    // 2. Instances with matching attributes and its values (only ==).
    //    What happens when objects (even in cloned object) have same
    //    attributes but varying values?

    // $foobar value is different
    echo "2. Instances with matching attributes  and its values (only ==) <br />";

    $baz->foobar = 2;
    echo '$foobar' . " value is different <br />";
    echo '$bar->foobar = ' . $bar->foobar . "<br />";
    echo '$baz->foobar = ' . $baz->foobar . "<br />";
    echo '$bar == $baz';
    var_dump($bar == $baz); // false

    // $foobar's value is the same again
    $baz->foobar = 1;
    echo '$foobar' . " value is the same again <br />";
    echo '$bar->foobar is ' . $bar->foobar . "<br />";
    echo '$baz->foobar is ' . $baz->foobar . "<br />";
    echo '$bar == $baz';
    var_dump($bar == $baz); // true

    // Changing values of properties in $qux object will change the property
    // value of $bar and evaluates true always, because $qux = &$bar.
    $qux->foobar = 2;
    echo '$foobar value of both $qux and $bar is 2, because $qux = &$bar' . "<br />";
    echo '$qux->foobar is ' . $qux->foobar . "<br />";
    echo '$bar->foobar is ' . $bar->foobar . "<br />";
    echo '$bar == $qux';
    var_dump($bar == $qux); // true

    // 3. Instances with different attributes (only ==)
    //    What happens when objects have different attributes even though
    //    one of the attributes has same value?
    echo "3. Instances with different attributes (only ==) <br />";

    // Dynamically create a property with the name in $name and value
    // in $value for baz object
    $name = 'newproperty';
    $value = null;
    $baz->createNewProperty($name, $value);
    echo '$baz->newproperty is ' . $baz->{$name};
    var_dump($baz);

    $baz->foobar = 2;
    echo '$foobar' . " value is same again <br />";
    echo '$bar->foobar is ' . $bar->foobar . "<br />";
    echo '$baz->foobar is ' . $baz->foobar . "<br />";
    echo '$bar == $baz';
    var_dump($bar == $baz); // false
    var_dump($bar);
    var_dump($baz);
?>

지금까지의 모든 답변은 ===의 위험한 문제를 무시하고 있습니다.정수와 더블은 다른 타입이므로 다음 코드는 강조되지 않습니다.

$n = 1000;
$d = $n + 0.0e0;
echo '<br/>'. ( ($n ==  $d)?'equal' :'not equal' );
echo '<br/>'. ( ($n === $d)?'equal' :'not equal' );

다음과 같은 기능이 있습니다.

 equal
 not equal

이것은 「반올림 에러」의 경우는 아닙니다.두 숫자는 마지막 비트까지 정확히 동일하지만 유형이 다릅니다.

===를 사용하는 프로그램은 모든 숫자가 충분히 작을 경우 수년 동안 행복하게 실행될 수 있기 때문에 심각한 문제입니다(이 경우 "충분히 작은" 것은 실행 중인 하드웨어와 OS에 따라 다름).그러나 우연히 정수가 2배로 변환될 정도로 크면 후속 연산 또는 많은 연산에 의해 값이 작은 정수로 되돌아갈 수 있더라도 그 유형은 "영원히" 변경됩니다.그리고 그것은 점점 더 나빠진다.그것은 확산될 수 있다 - 이중성 감염은 만지는 모든 것에 한번에 하나씩 전염될 수 있다.

예를 들어, 2038년 이후의 날짜를 다루는 프로그램에서는 이러한 문제가 발생할 수 있습니다.이 시점에서 UNIX 타임스탬프(1970-01 00:00:00 UTC 이후 초수)는 32비트 이상을 필요로 하기 때문에 일부 시스템에서는 그 표현이 "마술적으로" 전환되어 배가 됩니다.따라서 두 시간의 차이를 계산하면 2017년에 발생하는 정수 결과가 아닌 몇 초가 될 수 있습니다.

나는 이것이 현과 숫자의 변환보다 훨씬 더 나쁘다고 생각한다. 왜냐하면 그것은 미묘하기 때문이다.문자열과 숫자를 추적하는 것은 쉽지만 숫자 내의 비트 수를 추적하는 것은 제 능력 밖입니다.

따라서 위의 답변에는 몇 가지 좋은 표가 있지만 1(정수로서)과 1(하위 더블) 및 1.0(명백한 더블)의 구별은 없습니다.또한 ==가 제대로 작동하는 곳에서는 ===가 작동하지 않을 수 있으므로 항상 ===를 사용하지 말고 ==를 사용해야 한다는 조언은 좋지 않습니다.또한 JavaScript는 숫자 유형이 하나뿐이기 때문에 이와 동등하지 않습니다(내부적으로는 비트 단위 표현은 다를 수 있지만 ===에는 문제를 일으키지 않습니다).

내 조언은, 둘 다 쓰지 마.이 난장판을 고치려면 당신만의 비교 함수를 작성해야 합니다.

== (표준)과 === (표준이 동일)의 차이

PHP는 두 값의 동일성을 확인하기 위해 두 개의 비교 연산자를 제공합니다.두 중 큰 이 두 가지가 있다는 것입니다.'=='이 2개의 오퍼랜드인지 를 확인합니다.equal or not★★★★★★★★★★★★★★★★★★★.'==='는, , 값을 체크합니다.equal or not.

==(동등)

===(동등)

예 =>

<?php 
    $val1 = 1234;
    $val2 = "1234";
    var_dump($val1 == $val2);// output => bool(true)
    //It checks only operands value
?> 


<?php 
    $val1 = 1234;
    $val2 = "1234";
    var_dump($val1 === $val2);// output => bool(false)
    //First it checks type then operands value
?> 

cast $val2 to (int)$val2 또는 (string)$val1을 입력하면 true가 반환됩니다.

   <?php 
        $val1 = 1234;
        $val2 = "1234";
        var_dump($val1 === (int)$val2);// output => bool(true)
        //First it checks type then operands value
    ?> 

또는

  <?php 
        $val1 = 1234;
        $val2 = "1234";
        var_dump($val1 === (int)$val2);// output => bool(true)
        //First it checks type then operands value
    ?> 

가지 == ★★★★★★★★★★★★★★★★★」===키 정렬이 다른 2개의 배열과 오브젝트, 아무도 언급하지 않은 PHP 배열과 오브젝트.

키 종류가 다른 2개의 어레이

동일한 값 맵을 ( 키 값 맵을 사용합니다).===를 정렬하여 과 원래 할 수 있습니다 어레이의 키를 정렬하고 정렬된 어레이를 원래 어레이와 비교하려고 하면 문제가 발생할 수 있습니다.

예를 들어 다음과 같습니다.

$arrayUnsorted = [
    "you" => "you",
    "I" => "we",
];

$arraySorted = $arrayUnsorted;
ksort($arraySorted);

$arrayUnsorted == $arraySorted; // true
$arrayUnsorted === $arraySorted; // false

물건들

주요 규칙은 서로 다른개체가 절대 동일하지 않다는 것입니다.다음의 예를 참조해 주세요.

$stdClass1 = new stdClass();
$stdClass2 = new stdClass();
$clonedStdClass1 = clone $stdClass1;

$stdClass1 == $stdClass2; // true
$stdClass1 === $stdClass2; // false
$stdClass1 == $clonedStdClass1; // true
$stdClass1 === $clonedStdClass1; // false

참고: 개체를 다른 변수에 할당하면 복사본이 생성되지 않고 동일한 개체에 대한 참조가 생성됩니다.여기 보세요.

주의: PHP7부터는 익명 클래스가 도입되었습니다.와는 차이가 없다.new class {} a. a. a.new stdClass()를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/589549/php-vs-operator

반응형