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.


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ą .


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).

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


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.