Разница между $value==null и null==$value
в чем разница в размещении null Перед или за переменной, которую мы сравниваем, то есть в чем разница между:
if ($value==null){...}
и if (null==$value){...}
Я слышал, что второй вариант более эффективен с точки зрения компилятора, по правде говоря, я не знаю, в чем разница.
3 answers
В чем разница в размещении null перед или за переменной, которую мы сравниваем?
Нет никакой разницы, кроме соглашения о синтаксисе. Это относится как к тому, кто пишет код, чтобы избежать ошибок ввода, так и к Parser (по крайней мере, в PHP), который токенизирует исходный код, чтобы собрать дерево syntax, которое затем компилируется в байт-код, который затем интерпретирует, передает opcode (Platform assembler)
Константа, как число 42 или null-это токен, который имеет правило (в parser), за которым не может следовать токен присваивания ( a=), но токен сравнения (a == )
Почему он используется или рекомендуется?
Я объясняю с числом 42, чтобы сделать эффект этой практики более ясным. в своих домах они могут использовать null
В PHP (и других языках) обычно используется для предотвращения ошибок назначение.
#!/usr/bin/env php
<?php
$value = 40;
if ($value=42) :
echo "$value es 42".PHP_EOL;
else :
echo "$value NO es 42".PHP_EOL;
endif;
Результат:
$ ./yodacondition.php
42 es 42
Является простым примером, и мы можем вывести значение $value
Перед if
40
так что опечатка (положить =
вместо ==
) очевидна.
Но эта ошибка не была бы столь очевидной, если бы $value пришло с другой стороны.
Вместо этого, используя Yoda Conditions (https://en.wikipedia.org/wiki/Yoda_conditions)
#!/usr/bin/env php
<?php
$value = 40;
if (42=$value) :
echo "$value es 42".PHP_EOL;
else :
echo "$value NO es 42".PHP_EOL;
endif;
Результат:
$ ./yodacondition2.php
PHP Parse error: syntax error, unexpected '='
Это потому, что 42 является константа и не может быть присвоено значение.
То, что оптимизирует компилятор, кажется мне городским мифом, потому что скомпилированные языки обычно имеют оптимизаторы, которые собирают сравнительные таблицы и условный переход внутри для этого типа if then else.
Edit 2: в первом примере $value=42
не только присваивает значение 42
$value
, но и возвращает true
, удовлетворяя условию if
Учитывая количество ответов (три), которые, как я считаю, не отвечают на вопрос, я сделал небольшой тест, чтобы увидеть, является ли какой-либо из них более" быстрым "или"эффективным":
Состоит из запуска 1 миллион раз
if(null == $var){//}
иif($var == null){//}
Столбец с именем 'null' - это столбец
if(null == $var){//}
, а столбец с именем ' var ' - столбецif($var == null){//}
Iteraciones: 1000000 (20 ejecuciones)
# | null | rel % | var | rel %
----+----------+---------+-----------+--------
1 | 0.21405 | 97.2 % | 0.22014 | 102.8%
2 | 0.21474 | 104.2 % | 0.20613 | 96.0%
3 | 0.22034 | 103.9 % | 0.21200 | 96.2%
4 | 0.21678 | 96.4 % | 0.22485 | 103.7%
5 | 0.28206 | 138.0 % | 0.20432 | 72.4%
6 | 0.37546 | 91.6 % | 0.41001 | 109.2%
7 | 0.39286 | 98.8 % | 0.39760 | 101.2%
8 | 0.38703 | 97.7 % | 0.39617 | 102.4%
9 | 0.38722 | 96.7 % | 0.40030 | 103.4%
10 | 0.33443 | 82.9 % | 0.40357 | 120.7%
11 | 0.20490 | 87.2 % | 0.23485 | 114.6%
12 | 0.19351 | 100.7 % | 0.19219 | 99.3%
13 | 0.19576 | 97.3 % | 0.20112 | 102.7%
14 | 0.19199 | 88.9 % | 0.21584 | 112.4%
15 | 0.20707 | 100.5 % | 0.20597 | 99.5%
16 | 0.20554 | 104.3 % | 0.19706 | 95.9%
17 | 0.19500 | 95.1 % | 0.20504 | 105.1%
18 | 0.19618 | 101.5 % | 0.19333 | 98.5%
19 | 0.19848 | 102.1 % | 0.19432 | 97.9%
20 | 0.21158 | 101.8 % | 0.20785 | 98.2%
На мой взгляд, практически нет разницы с точки зрения "скорости" (учитывая, что есть миллион итерации).
На всякий случай тест был выполнен с php 7.1.7
Я читал это несколько раз, это не тема эффективности, это практика, которую можно применить, чтобы избежать ошибки следующего типа при сравнении:
if(variable == 5) //bien escrito
if(5 == $variable) //bien escrito
if(variable = 5) //No es lo que queríamos pero esta bien escrito y variable ahora vale 5,
if(5 = $variable) // Tira Error
Таким образом, набрав его "вверх ногами" мы заставляем его тянуть ошибку, а не продолжать работать и выше, изменяя значение моей переменной, если мы "забыли""==".