3 berbeda sama

149

Apa perbedaan antara =, ==dan ===?

Saya pikir menggunakan satu tanda sama adalah untuk mendeklarasikan variabel sementara dua tanda sama untuk kondisi perbandingan dan terakhir tiga tanda sama untuk membandingkan nilai variabel yang dideklarasikan.

Stroberi
sumber
lihat contohnya ... Saya telah mempostingnya akan menjelaskan lebih banyak hal ..
InfantPro'Aravind '
1
Untuk pengguna PHP tingkat lanjut, mengetahui perbedaan antara == dan === dan bertanya sendiri "apakah lebih cepat untuk membandingkan dengan == atau dengan === ketika saya yakin bahwa kedua operan adalah tipe yang sama?", Silakan lihat di skrip benchmark saya di bawah ini.
lucaferrario
@Strawberry Saya merasa tag pertanyaan juga harus menyertakan tag javascript karena juga berlaku untuk bahasa itu.
Funk Forty Niner
(Pembaruan): Saya telah menambahkan tag javascript dalam edit, karena ada beberapa pertanyaan di mana orang-orang menggunakan =javascript. Itu tidak hanya berlaku untuk PHP tetapi juga bahasa lain.
Funk Forty Niner
Aku pergi ke depan dan menghapus tag JavaScript: semua jawaban di sini hanya tentang PHP (kecuali terbaru yang sangat lemah), ada yang perbedaan antara bagaimana bahasa menanganinya, dan sudah ada facto kanonik pertanyaan JavaScript yang sama de ( yang sama operator (== vs ===) harus digunakan dalam perbandingan JavaScript? ).
JJJ

Jawaban:

172

Anda memiliki =satu operator penugasan , ==para operator perbandingan 'sama' dan ===para operator perbandingan 'identik' .

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

Untuk info lebih lanjut tentang perlunya ==dan ===, dan situasi untuk menggunakan masing-masing, lihat dokumen .

gnarf
sumber
ketika saya membandingkan dua datetime yang identik, saya memiliki hasil yang salah, mengapa? contoh: sandbox.onlinephpfunctions.com/code/…
stloc
3
@ stloc, ===dengan objek memberi tahu Anda jika mereka adalah objek yang sama, bukan jika mereka memiliki konten yang sama.
Andrea
Diperkenalkan dalam PHP4, lucu di Y2018 ;-)
mvorisek
22
  • = adalah operator penugasan
  • == adalah operator pembanding (memeriksa apakah dua variabel memiliki nilai yang sama)
  • === adalah operator pembanding yang identik (memeriksa apakah dua variabel memiliki nilai yang sama dan bertipe sama).
Adams kaya
sumber
8

= operator penugasan

== memeriksa apakah dua variabel memiliki nilai yang sama

=== memeriksa apakah dua variabel memiliki nilai yang sama DAN jika jenisnya sama

Silvio Donnini
sumber
1
Juga tahu tentang! = Dan! == versi 'bukan' dari dua operator perbandingan. Beberapa bahasa menggunakan: = sebagai tugas, hanya untuk menghindari kebingungan semacam ini.
Phil Perry
3

Operator = memberikan nilai ke variabel $ enam = 6; nilai 6 ditugaskan ke variabel $ enam

== operator memeriksa apakah nilai kedua variabel sama dan sebagian besar digunakan dalam kondisi seperti pernyataan if

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

=== Operator mirip dengan == (periksa apakah nilainya sama) dan juga periksa apakah keduanya dari tipe data yang sama

$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';
}

// di sini $ a adalah tipe int sedangkan $ b adalah tipe string. Jadi di sini hasilnya

Gideon Babu
sumber
0

Untuk pengguna PHP tingkat lanjut, mengetahui perbedaan antara ==dan ===bertanya pada diri sendiri "apakah lebih cepat untuk membandingkan dengan ==atau dengan ===ketika saya yakin bahwa kedua operan adalah tipe yang sama?"

Jawaban singkat dan umum adalah: Tidak ada keuntungan kinerja dalam menggunakan ===dalam hal ini, jadi sebaiknya Anda gunakan ==.

Untuk yang tertarik melakukan benchmark sendiri, Anda dapat menggunakan kode berikut yang saya tulis ad-hoc dan mencoba nilai yang berbeda untuk $adan $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";
?>

CATATAN: Perbandingan ini hanya berlaku ketika setiap "COBA PERTAMA" sangat dekat dengan "COBA KEDUA". Jika mereka berbeda secara signifikan, itu berarti bahwa prosesor sedang sibuk melakukan sesuatu yang lain saat menjalankan perbandingan dan hasilnya hasilnya tidak dapat diandalkan dan benchmark harus dijalankan lagi.

lucaferrario
sumber
9
Microbenchmark seperti ini tidak terlalu bisa diandalkan. Sangat tidak mungkin Anda ingin khawatir tentang ==atau ===sebagai penyebab masalah kinerja Anda. IMO: Lebih baik bersikap ketat ( ===) kecuali jika Anda secara eksplisit ingin longgar ( ==) tentang perbandingan Anda. Jumlah kasus tepi yang aneh yaitu "5 is not a number" == 5dapat menyebabkan bug aneh. ===tidak pernah menderita masalah ini.
gnarf
Tes saya adalah untuk memberi tahu programmer bahwa jika mereka memilih ===untuk alasan kinerja, mereka salah. Jadi programmer bebas memilih ===atau ==berdasarkan alasan logis tetapi tidak pada alasan kinerja: ada kasus yang berbeda untuk memilih satu atau yang lain dan kinerja tidak boleh diperhitungkan sama sekali.
lucaferrario