Как лучше всего сравнивать с 0 в PHP?

В одном бите кода, над которым я работаю, мне нужно извлечь значение из базы данных и проверить, есть ли он 0. Первоначально я написал это как:

if ($myVal == 0) { ...

Но когда я посмотрел на это снова сегодня, я понял там ошибку:

var_dump("foo" == 0);  // bool(true)

// and while we're here...
var_dump(intval("foo")); // int(0)

Поскольку это значение исходит из базы данных, обычно означает, что это будет строка, поэтому я предполагаю, что могу это сделать:

if ($myVal === "0")

но он кажется противоречащим интуиции, поскольку я действительно хочу иметь дело с целым числом, и это, как представляется, показывает, что мы работаем со строками. (Я надеюсь, что это имеет смысл для вас.) Кроме того, не должно быть неожиданным, что любой предоставленный DB Accessor выдавал значения их соответствующему типу, учитывая тип поля.

Какой метод вы используете для проверки значения 0, когда это может быть строка или int?

Ответ 1

Краткая версия:

if ("$myVal" === '0')

или

if (strval($myVal) === '0')

Длинная версия:

if ($myVal === 0 || $myVal === '0')

Ответ 2

Самое лучшее, что у меня есть сейчас:

is_numeric($myVal) && $myVal == 0

Ответ 3

Если значения, возвращаемые из базы данных, являются строками, но исходный тип данных является целым числом, тогда вы, вероятно, хотите, чтобы ваш DAO (объект доступа к данным или что-то другое, что тянул данные), чтобы отличать вещи от типов данных, которые вы ожидаете, Таким образом, PHP-код, который смотрит на значения, смотрит на тип данных, который он ожидает.

Несомненно, проблема заключается в том, что между типами данных, которые определяет БД, и типами данных PHP, не существует соответствия 1-1. Однако, по большей части это не проблема, так как для большинства типов мы используем эквивалентные типы: int, float, bool, string.

Результатом является то, что между местом, где вы запрашиваете базу данных, и местом, где вы проверяете эти значения, эти значения должны быть приведены к типам данных, которые вы ожидаете. Я просто протестировал с mysql_fetch_object() в таблице MySQL, содержащей int (10) и varchar (50); оба поля всегда были втянуты как "строка" PHP. Поэтому, если вы хотите, чтобы одно из полей рассматривалось как int, переведите его в int перед тем, как вы что-нибудь сделаете с ним. Например:

$rs = mysql_query("SELECT * FROM table");
while ($row = mysql_fetch_object($rs)) {
    $RealRow->id = (int)$row->id;
    $RealRow->name = $row->name;
    // etc.
}

// ... later ...

if ($RealRow->status == 0) {
    // do something
}

Запрос и материал RealRow должны находиться внутри класса/метода, чтобы он был инкапсулирован; Таким образом, ЛЮБАЯ часть вашего кода, которая получает данные из table, всегда будет получать объект $RealRow, который будет иметь все, что задано для правильных типов данных. Конечно, если вы меняете типы данных, это требует ручного редактирования DAO для решения вопроса о литье; также можно было бы запросить БД для получения типа каждого поля (с помощью "SHOW COLUMNS FROM table" ) и автоматически отнести поля к соответствующему типу данных.

Ответ 4

Я думаю, вы должны просто использовать

if ($myVal == 0)

Я не думаю, что нужно беспокоиться о том, является ли $myVal "foo". Вы сами сказали, что это значение только когда-либо будет числом.

Другими словами, если вы когда-либо испытывали $myVal как "foo", ошибка не была "foo" == 0, ошибка в том, что $myVal является "foo", когда он должен быть числом.

Ответ 5

Попробуйте использовать intval(), чтобы передать строку в int

if( intval($myVal) == 0 )

Ответ 6

if( ('integer' === gettype($is_anonymous) && $is_anonymous === 0 )
    ||
    ('string' === gettype($is_anonymous) && $is_anonymous === '0')    
 ) {
    echo 'matches';
}