Логическое значение становится числовым в PHP

StackOverflow https://stackoverflow.com/questions/2343701

  •  23-09-2019
  •  | 
  •  

Вопрос

РЕДАКТИРОВАТЬ:Я считаю, что мое замешательство, вероятно, вызвано этим кодом вверху страницы, на котором я проверяю значение опции...Это создает ярлык для ссылки на опцию без использования метода get_option('option')...

global $options;
foreach ($options as $value) {
if (get_settings( $value['id'] ) === FALSE) { 
        $$value['id'] = $value['std']; 
    } else { 
        $$value['id'] = get_settings( $value['id'] );
    }
}

Итак, когда я устанавливаю значение переменной $myvar с помощью флажка, установленного на панели параметров моей темы, и нажимаю «Сохранить», а затем просматриваю свой файл options.php в worpdress, значение переменной равно

true

И когда я выполняю поиск по этой переменной, используя

if($myvar == "true")

Это проходит.

Однако когда я устанавливаю значение напрямую с помощью метода update_options(), вот так...

$mvar = true;
update_option('myvar', $myvar);

Значение меняется с true на 1.

И когда я делаю то же сравнение, что и раньше, if($myvar == "true"), оно терпит неудачу.Это уже не «правда».

Что мне не хватает?(1) почему «true» и 1, а не оценивают то же самое и (2) что метод update_option делает со значением myvar, чтобы изменить значение с true на 1?

Это было полезно?

Решение

Пытаться

if($myvar == true)

и

$myvar = true;

TRUE и FALSE — это встроенные в PHP логические переменные, которые гораздо более универсальны, чем настоящая строка.


О update_option.Возможно, опция меняет его на 1.Вместо этого может случиться так, что при вставке его в базу данных он вставляет его как строку "true".Затем, когда он возвращается, он преобразуется в логическое значение. true, который при печати имеет вид 1

Другие советы

Пытаться

if ($myvar)

Не проверяйте, «равны» ли вещи истине: они либо истинны, либо нет.

Вам следует изменить свой первый тест на if($myvar == true) или просто if ($myvar).В PHP есть несколько странных правил относительно того, что является «истиной»;Обычно строки возвращают значение true, за исключением особых случаев: "0" и пустая строка "", который приводит к значению false.

В вашем конкретном примере if ($myvar == "true"):

  • Если $myvar содержит логическое значение, выражение будет оцениваться как (bool) == (bool)"true", или (bool) == true
  • Если $myvar содержит целое число, оно преобразуется в строку и сравнивается со строкой «true»;поэтому ваш тест не пройден, потому что «1» != «истина».
  • Если $myvar является строкой, происходит сравнение строк, и неожиданно успешно сравнивается только литеральная строка «true».

Я предполагаю, что действуют 2-й и 3-й случаи:Wordpress, скорее всего, устанавливается $myval к строке "true" когда сообщение отправится обратно, ваш тест пройдет успешно.Когда вы вручную указываете логическое значение true, Wordpress должен преобразовать его в целое число, а затем происходит сравнение целых чисел, но оно завершается неудачно, поскольку целое число 1 будет преобразовано в строку "1" по сравнению с "true".

Вы выполняете свободное сравнение между целым числом 1 и строкой «истина».Для этого PHP преобразует строку в число.«тест» как число равно 0:

var_dump((int) 'true'); // int(0)

А поскольку 0 не равно 1, сравнение вернет false.

Как уже правильно указано в некоторых других ответах, вам следует протестировать логический литерал TRUE или true.Если один оператор при проверке равенства является логическим, PHP преобразует и другой оператор в логическое значение, что для числа 1 даст

var_dump((bool) 1); // boolean(true)

И тогда ваш тест пройдет, потому что истина равна истине.

Проверьте Таблица сравнения типов понять, как PHP манипулирует типами, когда проверка на равенство.

Что касается того, что check_update делает с вашим логическим значением, проверьте описание функции:

(смешанный) (обязательно) НОВОЕ значение для этого имени параметра.Это значение может быть строкой, массивом, объектом или сериализованным значением.

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

«true» — это строка, и все строки возвращаются к логическому значению 1 (попробуйте привести (bool) $string. true с другой стороны, без кавычек, является логическим значением и будет иметь значение 1.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top