3 bằng nhau


149

Sự khác nhau giữa là gì =, =====?

Tôi nghĩ rằng sử dụng một dấu bằng là khai báo một biến trong khi hai dấu bằng cho điều kiện so sánh và cuối cùng là ba dấu bằng để so sánh giá trị của các biến được khai báo.


xem ví dụ ... Tôi đã đăng nó sẽ làm rõ nhiều thứ hơn ..
InfantPro'Aravind '

1
Đối với người dùng PHP nâng cao, biết sự khác biệt giữa == và === và tự hỏi họ "có nhanh hơn so với == hoặc với === khi tôi chắc chắn rằng cả hai toán hạng đều cùng loại?", Vui lòng xem tại kịch bản điểm chuẩn của tôi dưới đây.
lucaferrario

@Strawberry Tôi cảm thấy thẻ câu hỏi cũng nên bao gồm thẻ javascript vì nó cũng áp dụng cho ngôn ngữ đó.
Funk Bốn mươi Niner

(Cập nhật): Tôi đã thêm thẻ javascript trong một chỉnh sửa, vì đã có khá nhiều câu hỏi mà mọi người đang sử dụng =trong javascript. Điều đó không chỉ áp dụng cho PHP mà các ngôn ngữ khác cũng vậy.
Funk Bốn mươi Niner

Tôi đã đi trước và xóa thẻ JavaScript: tất cả các câu trả lời ở đây chỉ là về PHP (trừ mới nhất mà là rất yếu), có được sự khác nhau giữa cách ngôn ngữ xử lý nó, và đã có một thực tế kinh điển câu hỏi JavaScript tương tự de ( Những bằng toán tử (== vs ===) nên được sử dụng trong so sánh JavaScript? ).
JJJ

Câu trả lời:


172

Bạn có =các toán tử gán , ==các toán tử so sánh 'bằng'===các toán tử so sánh 'giống hệt' .

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

Để biết thêm thông tin về nhu cầu =====, và các tình huống sử dụng, hãy xem các tài liệu .


Khi tôi so sánh hai datetime giống hệt nhau, tôi có kết quả sai, tại sao? ví dụ: sandbox.onlinephpfifts.com/code/ từ
stloc

3
@stloc, ===với các đối tượng cho bạn biết nếu chúng là cùng một đối tượng, không phải nếu chúng có cùng nội dung.
Andrea

Được giới thiệu trong PHP4, vui nhộn trong Y2018 ;-)
mvorisek

22
  • = là toán tử gán
  • == là toán tử so sánh (kiểm tra nếu hai biến có giá trị bằng nhau)
  • === là toán tử so sánh giống hệt nhau (kiểm tra nếu hai biến có giá trị bằng nhau và cùng loại).

8

= toán tử gán

== kiểm tra nếu hai biến có cùng giá trị

=== kiểm tra xem hai biến có cùng giá trị VÀ nếu kiểu của chúng giống nhau không


1
Cũng biết về các phiên bản! = Và! == 'không' của hai toán tử so sánh. Một số ngôn ngữ sử dụng: = làm bài tập, chỉ để tránh loại nhầm lẫn này.
Phil Perry

3

Toán tử = gán giá trị cho biến $ six = 6; giá trị 6 được gán cho biến $ sáu

Toán tử == kiểm tra xem giá trị của cả hai biến có bằng nhau không và được sử dụng chủ yếu trong các điều kiện như câu lệnh if

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

Toán tử === tương tự == (kiểm tra xem giá trị có bằng không) và cũng kiểm tra xem cả hai cùng loại dữ liệu

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

// ở đây $ a là kiểu int trong khi $ b là kiểu chuỗi. Vì vậy, ở đây đầu ra


0

Đối với người dùng PHP nâng cao, việc biết sự khác biệt giữa =====và tự hỏi mình "có nhanh hơn khi so sánh với ==hoặc ===khi tôi chắc chắn rằng cả hai toán hạng đều cùng loại?"

Câu trả lời ngắn gọn và chung chung là: Không có hiệu suất đạt được khi sử dụng ===trong trường hợp này, vì vậy bạn có thể nên sử dụng ==.

Đối với những người quan tâm đến việc tự chuẩn hóa nó, bạn có thể sử dụng mã sau đây tôi đã viết đặc biệt và thử các giá trị khác nhau cho $a$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";
?>

LƯU Ý: Việc so sánh chỉ có hiệu lực khi mỗi "TRY ĐẦU TIÊN" rất gần với "THỨ HAI". Nếu chúng khác nhau đáng kể, điều đó có nghĩa là bộ xử lý đã bận làm việc khác trong khi thực hiện so sánh và do đó, kết quả không đáng tin cậy và điểm chuẩn sẽ được chạy lại.


9
Microbenchmark như thế này không đáng tin cậy lắm. Cũng rất khó có khả năng bạn muốn lo lắng ==hoặc ===là nguyên nhân của vấn đề hiệu suất của bạn. IMO: Tốt hơn hết là nghiêm khắc ( ===) trừ khi bạn rõ ràng muốn lỏng lẻo ( ==) về những so sánh của mình. Số lượng các trường hợp cạnh lạ tức là "5 is not a number" == 5có thể dẫn đến lỗi lập dị. ===không bao giờ bị vấn đề này
gnarf

Thử nghiệm của tôi là nói với các lập trình viên rằng nếu họ chọn ===vì lý do hiệu suất, họ đã sai. Vì vậy, các lập trình viên có thể tự do lựa chọn ===hoặc ==dựa trên lý do logic nhưng không phải vì lý do hiệu suất: có nhiều trường hợp khác nhau để thích cái này hay cái kia và hiệu suất không phải được tính đến.
lucaferrario
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.