Булево значение превращается в число в PHP - PullRequest
1 голос
/ 26 февраля 2010

РЕДАКТИРОВАТЬ: я думаю, что моя путаница, вероятно, создается этим кодом в верхней части страницы, на которой я проверяю значение параметра ... Это создает ярлык для ссылки на параметр без использования 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

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

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

Ответы [ 5 ]

5 голосов
/ 26 февраля 2010

Попробуйте

if($myvar == true)

и

$myvar = true;

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


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

1 голос
/ 26 февраля 2010

Попробуйте

if ($myvar)

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

0 голосов
/ 26 февраля 2010

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

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

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

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

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

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

Изучите Сравнительную таблицу типов , чтобы понять, как PHP манипулирует типами при тестировании на равенство .

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

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

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

0 голосов
/ 26 февраля 2010

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

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

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

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

0 голосов
/ 26 февраля 2010

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

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