Разница между $value==null и null==$value


в чем разница в размещении null Перед или за переменной, которую мы сравниваем, то есть в чем разница между: if ($value==null){...} и if (null==$value){...} Я слышал, что второй вариант более эффективен с точки зрения компилятора, по правде говоря, я не знаю, в чем разница.

Author: Shaz, 2018-04-04

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

 2
Author: alo Malbarez, 2018-04-04 17:38:52

Учитывая количество ответов (три), которые, как я считаю, не отвечают на вопрос, я сделал небольшой тест, чтобы увидеть, является ли какой-либо из них более" быстрым "или"эффективным":

Состоит из запуска 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

 4
Author: Shaz, 2020-06-11 10:54:57

Я читал это несколько раз, это не тема эффективности, это практика, которую можно применить, чтобы избежать ошибки следующего типа при сравнении:

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

Таким образом, набрав его "вверх ногами" мы заставляем его тянуть ошибку, а не продолжать работать и выше, изменяя значение моей переменной, если мы "забыли""==".

 1
Author: Leonardo Cabré, 2018-04-04 17:12:27