2010-01-14 33 views
119

Sự khác nhau giữa =, ===== là gì?3 số khác nhau bằng

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

+0

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

+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 "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? ", hãy xem kịch bản điểm chuẩn của tôi bên dưới. – lucaferrario

+0

@Strawberry Tôi cảm thấy thẻ của câu hỏi cũng nên bao gồm thẻ [javascript] (http://stackoverflow.com/tags/javascript/info) vì nó cũng áp dụng cho ngôn ngữ đó. –

Trả lời

149

Bạn có = các nhà điều hành phân, == các nhà điều hành so sánh 'bằng'=== các nhà điều hành 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 về sự cần thiết của =====, và các tình huống sử dụng mỗi, nhìn vào the docs.

+0

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ụ: http://sandbox.onlinephpfunctions.com/code/aef1451396f26fd6f8b623c4bb676f508c938006 – stloc

+0

@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 chúng có cùng nội dung hay không. – Andrea

2

Bạn nói đúng rằng = là toán tử gán. Hai cái còn lại là toán tử so sánh mà bạn có thể đọc thêm về here.

7

= phân công điều hành

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

kiểm tra === nếu hai biến có cùng giá trị và nếu loại của họ đều giống nhau

+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. –

18
  • = 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à so sánh giống hệt nhau Nhà điều hành (kiểm tra xem hai biến số có giá trị bằng nhau và thuộc cùng loại ).
1

Mọi người khác đã làm rõ ... Tôi chỉ muốn thêm một ví dụ để làm rõ điều này hơn:

<?php 
    $mystring = 'abc'; 
    $findme = 'a'; 
    $pos = strpos($mystring, $findme); 

    // Note our use of ===. Simply == would not work as expected 
    // because the position of 'a' was the 0th (first) character. 
    if ($pos === false) { 
     echo "The string '$findme' was not found in the string '$mystring'"; 
    } 
    else { 
     echo "The string '$findme' was found in the string '$mystring'"; 
     echo " and exists at position $pos"; 
    } 
?> 
2

lẽ bạn có thể hiểu rõ hơn về sự khác biệt giữa == và === với một ví dụ liên quan đến việc đúc tự động:

echo '"5 is not a number" == 5'."\n"; 
if("5 is not a number" == 5) { 
    echo "maybe there is something wrong here\n"; 
} else { 
    echo " The integer and the string are different\n"; 
} 
echo '"5 is not a number" === 5'."\n"; 
if("5 is not a number" === 5) { 
    echo "maybe there is something wrong here\n"; 
} else { 
    echo " The integer and the string are different\n"; 
} 
+0

Ví dụ hoàn hảo :) – gnarf

+5

Tôi không hiểu mục đích của ví dụ này. –

+0

@KorayTugay Mục đích của ví dụ là để cho bạn thấy rằng hai biểu thức, so với hai toán tử, sẽ dẫn đến kết quả ngược lại. Tuy nhiên, không có một nhà điều hành tốt và xấu, bạn phải chọn một hoặc một người khác dựa trên nhu cầu của bạn. – Eineki

1

Đối với người dùng PHP tiên tiến, biết sự khác biệt giữa ===== và hỏi bản thân "là nó nhanh hơn để so sánh 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? "

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

Đối với những người quan tâm đến điểm chuẩn đó bản thân, bạn có thể sử dụng đoạn mã sau tôi đã viết ad-hoc 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"; 
?> 

Chú ý: Việc so sánh chỉ có hiệu lực khi mỗi "FIRST TRY" rất gần với "THỬ NGHIỆM THỨ HAI" của mình. Nếu chúng khác biệt đáng kể, điều đó có nghĩa là bộ vi xử lý đang 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 nên được chạy lại.

+8

Microbenchmarks như thế này không phải là rất đáng tin cậy. Nó cũng rất khó mà bạn muốn bao giờ lo lắng về '==' 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 ngặt ('===') trừ khi bạn rõ ràng muốn bị lỏng lẻo ('==') về sự so sánh của bạn. Số lượng các trường hợp cạnh kỳ lạ tức là "" 5 không phải là số "== 5' có thể dẫn đến các lỗi lập dị. '===' không bao giờ bị vấn đề này. – gnarf

+0

Bài kiểm tra 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, chúng sai. Vì vậy, lập trình viên được 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ó những trường hợp khác nhau để thích cái này hay cái kia và hiệu suất không được tính đến chút nào. – lucaferrario

3

Lời giải thích đơn giản nhất tôi biết:

<?php 

$a = 1; 
$b = "1"; 
echo "comparing different types:<br/>"; 
compare($a, $b); 

$a = 1; 
$b = 1; 
echo "comparing equal types:<br/>"; 
compare($a, $b); 

function compare($a, $b) 
{ 
    if($a == $b) 
     echo "a == b<br/>"; 

    if($a === $b) 
     echo "a === b<br/>"; 
} 

?> 
1

Tiếp theo chênh lệch giữa =. ==. và ===:

= Chuyển nhượng nhà điều hành, toán tử so sánh

== 'bình đẳng' và

'giống hệt' toán tử so sánh ===.

$a = $b Gán đặt $ a bằng $ b. tức là $a = 5; Vì vậy, $ a giá trị gán 5.

$a == $b Tương đương TRUE nếu $ a bằng $ b. tức là if($a==5) Ở đây chúng ta thấy chúng tôi đang sử dụng == để so sánh giá trị.

$a === $b TRUE nếu $ a bằng $ b và chúng cùng loại. (được giới thiệu trong PHP 4) tức là ($a ===5) Điều này cũng được sử dụng để so sánh nhưng nó cũng so sánh giá trị và cũng như kiểu dữ liệu. Nó có nghĩa là $a = '5'$a = 5 không giống nhau. $a = '5' có nghĩa là $ a assign string '5' và $a=5 gán giá trị số nguyên 5.

Các vấn đề liên quan