3 разных равных

149

В чем разница между =, ==и ===?

Я думаю, что использование одного знака равенства означает объявление переменной, в то время как два знака равенства предназначены для условия сравнения, и, наконец, три знака равенства предназначены для сравнения значений объявленных переменных.

клубника
источник
посмотрите пример ... Я опубликовал его, чтобы прояснить больше вещей ...
InfantPro'Aravind '14
1
Для опытных пользователей PHP, зная разницу между == и === и спрашивая себя «быстрее ли сравнивать с == или с ===, когда я уверен, что оба операнда имеют одинаковый тип?», Пожалуйста, посмотрите на мой скрипт ниже.
Lucaferrario
@Strawberry Я считаю, что тег вопроса должен также включать тег javascript, поскольку он также применим к этому языку.
Funk Forty Niner
(Обновление): я добавил тег javascript в редактирование, так как было довольно много вопросов, которые люди использовали =в javascript. Это относится не только к PHP, но и к другим языкам.
Funk Forty Niner
Я пошел вперед и удалил тег JavaScript: все ответы здесь только о PHP ( за исключением последней , которая очень слабо), есть является различие между тем, как языки справиться с этим, и уже есть подобный де - факто канонический JavaScript вопрос ( который равен оператор (== vs ===) должен использоваться в сравнениях JavaScript? ).
JJJ

Ответы:

172

Вы имеете =в оператор присваивания , ==в «равного» оператор сравнения и ===в «идентичный» оператор сравнения .

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

Для получения дополнительной информации о необходимости ==и ===, и ситуации, чтобы использовать каждый, посмотрите на документы .

gnarf
источник
когда я сравниваю два одинаковых datetime, у меня ложный результат, почему? пример: sandbox.onlinephpfunctions.com/code/…
stloc
3
@stloc, ===с объектами говорит вам, если это один и тот же объект, а не если они имеют одинаковое содержимое.
Андреа
Введено в PHP4, смешно в Y2018 ;-)
mvorisek
22
  • = является оператором присваивания
  • == является оператором сравнения (проверяет, имеют ли две переменные одинаковые значения)
  • === является идентичным оператором сравнения (проверяет, имеют ли две переменные одинаковые значения и имеют ли они одинаковый тип).
Рич Адамс
источник
8

= оператор присваивания

== проверяет, имеют ли две переменные одинаковое значение

=== проверяет, имеют ли две переменные одинаковое значение И, если их типы одинаковы

Сильвио Доннини
источник
1
Также знайте о! = И! == «не» версиях двух операторов сравнения. Некоторые языки используют: = как назначение, просто чтобы избежать путаницы.
Фил Перри
3

Оператор = присваивает значение переменной $ six = 6; значение 6 присваивается переменной $ шесть

== оператор проверяет, равны ли значения обеих переменных и используются ли они в основном в таких условиях, как операторы if

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

=== Оператор похож на == (проверьте, равно ли значение), а также проверьте, если оба типа данных

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

// здесь $ a имеет тип int, тогда как $ b имеет тип string. Так что здесь вывод

Гидеон Бабу
источник
0

Для опытных пользователей PHP, зная разницу между ==и ===спрашивая себя «быстрее ли сравнивать ==или ===когда я уверен, что оба операнда одного типа?»

Краткий и общий ответ таков: в этом случае выигрыша в производительности нет ===, поэтому вам, вероятно, стоит его использовать ==.

Для тех, кто заинтересован в его тестировании, вы можете использовать следующий код, который я написал ad-hoc, и попробовать разные значения для $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";
?>

ПРИМЕЧАНИЕ. Сравнение действительно только тогда, когда каждая «ПЕРВАЯ ПОПРОБОВКА» очень близка к «ВТОРОЙ ПОПЫТКЕ». Если они значительно отличаются, это означает, что процессор был занят чем-то другим, выполняя сравнения, и поэтому результаты ненадежны, и эталонный тест следует запустить снова.

lucaferrario
источник
9
Подобные микробенчмарки не очень надежны. Также крайне маловероятно, что вы когда-либо захотите о чем-то беспокоиться ==или ===как о причине проблем с производительностью. ИМО: Лучше быть строгим ( ===), если вы явно не хотите быть свободным ( ==) в своих сравнениях. Количество странных крайних случаев, т. "5 is not a number" == 5Е. Может привести к дурацким ошибкам. ===никогда не страдает от этой проблемы.
Gnarf
Мой тест состоял в том, чтобы сказать программистам, что, если они выбирают ===по причинам производительности, они ошибаются. Таким образом, программисты могут выбирать ===или ==исходить из логических соображений, но не из соображений производительности: существуют разные случаи, когда они предпочитают один или другой, и производительность вообще не должна приниматься во внимание.
lucaferrario