Почему сравнение и empty () ведут себя так в PHP? - PullRequest
3 голосов
/ 14 сентября 2009

PHP:

$a = "0";
$b = "00";
var_dump(empty($a)); # True (wtf?)
var_dump($a == $b); # True... WTF???
var_dump(empty($b)); # False WWWTTTFFFF!!??

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

Почему это так? Это как-то облегчает определенные вещи?

Ответы [ 6 ]

9 голосов
/ 14 сентября 2009

Что касается "0" == "00" разрешения true, ответ лежит в Операторы сравнения :

Если сравнить целое число с строка, строка преобразуется в номер . Если сравнить два числовых строки, они сравниваются как целые числа. Эти правила также применяются к оператор переключения.

(выделение добавлено)

И "0", и "00" являются числовыми строками, поэтому выполняется числовое сравнение и, очевидно, 0 == 0.

Я бы предложил вместо этого использовать ===, если вы не хотите никакого неявного преобразования типов.

Что касается empty():

Следующие вещи считаются быть пустым:

  • "" (пустая строка)
  • 0 (0 как целое число)
  • "0" (0 в виде строки)
  • NULL
  • FALSE
  • array () (пустой массив)
  • var $ var; (объявленная переменная, но без значения в классе)
2 голосов
/ 14 сентября 2009

http://au2.php.net/empty

Следующие вещи считаются пустыми: «0» (0 как строка)

но "00" не будет считаться пустым.

1 голос
/ 14 сентября 2009

Все это вытекает из цели дизайнера языка «делать правильные вещи».

То есть данный фрагмент кода должен делать то, чего ожидают ни программист, либо случайный зритель фрагмента кода. Это была непростая цель.

Php избежал большинства наихудших ошибок других языков (например, C's if (a = b) {... или perl's if ("xxxx" == 0) {print "True!";}). 0 == 0000 и if ("000") {echo "True!"; } это два из немногих случаев, когда код может не выполнять то, что вы ожидаете, но на практике это редко является проблемой. По моему опыту, «лечение» с использованием оператора точного сравнения === - это единственная гарантия того, что начинающие php-программисты будут чесать там головы и искать руководство.

1 голос
/ 14 сентября 2009

Это связано с тем, что PHP считает пустым, и, как предположил @Shadow, это проблема динамической типизации. 0 и 00 равны в глазах PHP. Попробуйте вместо этого использовать строгое равенство:

($ a === $ b) // равно b И того же типа (строки)

0 голосов
/ 14 сентября 2009

Из документации можно предположить, что 0 может быть либо целой строкой, либо 1 символьной строкой для обозначения пустой. 00 было бы скорее предположением о форматировании, поскольку нет такой вещи, как 00, но есть 0. 00 означало бы 2-х целочисленный формат, но функция empty () пишется только для 0.

FWIW IANA php разработчик.

0 голосов
/ 14 сентября 2009

Проверьте документы на пустое http://us.php.net/empty. Это должно заботиться о первой и третьей строках.

во-вторых, это потому, что PHP динамически типизируется. интерпретатор выводит тип переменных для использования в контексте, в котором вы их использовали. В этом случае интерпретатор, вероятно, думает, что вы пытаетесь сравнить числа и преобразовать строку в целые, прежде чем сравнивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...