3 różne są równe

149

Jaka jest różnica między =, ==i ===?

Myślę, że użycie jednego znaku równości służy do zadeklarowania zmiennej, podczas gdy dwa znaki równości służą do warunku porównania, a na koniec trzy znaki równości służą do porównywania wartości zadeklarowanych zmiennych.

Truskawka
źródło
zobacz przykład ...
Wysłałem,
1
Dla zaawansowanych użytkowników PHP, znających różnicę między == i === i zadając sobie pytanie "czy szybciej jest porównać z == czy z ===, kiedy jestem pewien, że oba operandy są tego samego typu?", Proszę spojrzeć w moim skrypcie testowym poniżej.
lucaferrario
@Strawberry Myślę, że tag pytania powinien również zawierać tag javascript, ponieważ dotyczy to również tego języka.
Funk Forty Niner
(Aktualizacja): Dodałem tag javascript w edycji, ponieważ było sporo pytań, w których ludzie używali =w javascript. Dotyczy to nie tylko PHP, ale także innych języków.
Funk Forty Niner
I poszedł do przodu i usunięte tag JavaScript: wszystkie odpowiedzi są tu tylko o PHP (z wyjątkiem ostatni, który jest bardzo słaby), tam różnice między językami poradzić, a istnieje już podobny de facto kanoniczny pytanie JavaScript ( co równa operator (== vs ===) powinien być używany w porównaniach JavaScript? ).
JJJ

Odpowiedzi:

172

Musisz =się operator przypisania , ==z „równe” operator porównania i ===ten „identyczne” operator porównania .

$a = $b     Assign      Sets $a to be equal to $b.
$a == $b    Equal       TRUE if $a is equal to $b.
$a === $b   Identical   TRUE if $a is equal to $b, and they are of the same type. (introduced in PHP 4)

Aby uzyskać więcej informacji na temat potrzeby stosowania ==i ===sytuacji, w których należy ich używać, zapoznaj się z dokumentacją .

gnarf
źródło
kiedy porównuję dwie identyczne daty i godziny, mam fałszywy wynik, dlaczego? przykład: sandbox.onlinephpfunctions.com/code/…
stloc
3
@stloc, ===z obiektami informuje, czy są to ten sam obiekt, a nie, czy mają taką samą zawartość.
Andrea
Wprowadzony w PHP4, zabawny w Y2018 ;-)
mvorisek
22
  • = jest operatorem przypisania
  • == jest operatorem porównania (sprawdza, czy dwie zmienne mają równe wartości)
  • === jest identycznym operatorem porównania (sprawdza, czy dwie zmienne mają równe wartości i są tego samego typu).
Rich Adams
źródło
8

= operator przypisania

== sprawdza, czy dwie zmienne mają tę samą wartość

=== sprawdza, czy dwie zmienne mają tę samą wartość ORAZ czy ich typy są takie same

Silvio Donnini
źródło
1
Wiedz także o wersjach! = I! == 'not' dwóch operatorów porównania. Niektóre języki używają: = jako przypisania, aby uniknąć tego rodzaju zamieszania.
Phil Perry,
3

Operator = przypisuje wartość zmiennej $ sześć = 6; wartość 6 jest przypisana zmiennej $ sześć

== operator sprawdza, czy wartości obu zmiennych są równe i najczęściej używane w warunkach takich jak instrukcje if

$a = 2;
$b = 2;
if ($a == $b) { 
    echo both variables have the same value; 
}

=== operator podobny do == (sprawdź, czy wartość jest równa), a także sprawdź, czy oba mają ten sam typ danych

$a = 2;
$b = "2";
if ($a === $b) {
    echo "both variable have same value and of same data type";
} else {
    echo 'both variable is either not equal or not of same data type';
}

// tutaj $ a jest typu int, podczas gdy $ b jest typu string. Więc tutaj wyjście

Gideon Babu
źródło
0

Dla zaawansowanych użytkowników PHP, znając różnicę między ==i ===i zadając sobie pytanie „czy jest szybsze porównanie z ==lub z, ===gdy jestem pewien, że oba operandy są tego samego typu?”

Krótka i ogólna odpowiedź brzmi: w takich przypadkach nie ma wzrostu wydajności ===, więc prawdopodobnie powinieneś użyć ==.

Osoby zainteresowane samodzielnym testowaniem porównawczym mogą skorzystać z następującego kodu, który napisałem ad-hoc i wypróbować różne wartości dla $ai $b:

<?php
    // CONFIGURATION
    $cycles = 1000000;
    $a = 'random string 1';
    $b = 'random string 2';

    // FUNCTIONS
    function compare_two_equals($a, $b) {
        if ($a == $b) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    function compare_three_equals($a, $b) {
        if ($a === $b) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

    // EXECUTION
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_two_equals($a, $b);
    }
    $time_two_a = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_three_equals($a, $b);
    }
    $time_three_a = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_two_equals($a, $b);
    }
    $time_two_b = microtime(TRUE) - $time;
    $time = microtime(TRUE);
    for ($count_a = 0; $count_a < $cycles; $count_a++) {
        compare_three_equals($a, $b);
    }
    $time_three_b = microtime(TRUE) - $time;
    $time = microtime(TRUE);

    // RESULTS PRINTING
    print "<br />\nCOMPARE == (FIRST TRY): " . number_format($time_two_a, 3) . " seconds";
    print "<br />\nCOMPARE == (SECOND TRY): " . number_format($time_two_b, 3) . " seconds";
    print "<br />\nCOMPARE === (FIRST TRY): " . number_format($time_three_a, 3) . " seconds";
    print "<br />\nCOMPARE === (SECOND TRY): " . number_format($time_three_b, 3) . " seconds";
?>

UWAGA: Porównanie jest ważne tylko wtedy, gdy każda „PIERWSZA PRÓBA” jest bardzo bliska jej „DRUGIEJ PRÓBY”. Jeśli są znacząco różne, oznacza to, że procesor był zajęty robieniem czegoś innego podczas wykonywania porównań, więc wyniki są niewiarygodne i benchmark należy uruchomić ponownie.

lucaferrario
źródło
9
Takie mikroznakowania nie są zbyt wiarygodne. Jest również wysoce nieprawdopodobne, abyś kiedykolwiek chciał się martwić ==lub ===jako przyczyna problemu z wydajnością. IMO: Lepiej jest być ścisłym ( ===), chyba że wyraźnie chcesz luźno ( ==) w porównaniach. Liczba dziwnych skrajnych przypadków, tj. "5 is not a number" == 5Może prowadzić do zwariowanych błędów. ===nigdy nie cierpi na ten problem.
gnarf
Mój test polegał na tym, aby powiedzieć programistom, że jeśli wybierają ===ze względu na wydajność, to się mylą. Tak więc programiści mają swobodę wyboru ===lub ==opierają się na logicznych powodach, ale nie na wydajności: są różne przypadki, w których preferują jeden lub drugi, a wydajność nie może być w ogóle brana pod uwagę.
lucaferrario