PHP中的布尔值转换为数值

yruzcnhs  于 2023-06-21  发布在  PHP
关注(0)|答案(6)|浏览(194)

编辑:我相信我的困惑可能是由页面顶部的代码造成的,我正在测试选项的值...这将创建一个快捷方法来引用该选项,而无需使用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的值并单击保存,然后在worpdress中查看我的options.php时,变量的值为

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?

ykejflvf

ykejflvf1#

试试看

if($myvar == true)

和/或

$myvar = true;

TRUEFALSE是PHP内置的布尔变量,比真正的字符串更通用。
关于update_option。可能不是选项将其更改为1。相反,当它将其插入数据库时,它可能会将其作为字符串"true"插入。然后,当返回时,它被转换为布尔值true,打印时为1

rjjhvcjd

rjjhvcjd2#

试试看

if ($myvar)

不要测试事物是否“等于”真,它们要么是真的,要么不是。

muk1a3rh

muk1a3rh3#

您应该将第一个测试更改为if($myvar == true)或简单地更改为if ($myvar)。PHP对于什么是“真”有一些奇怪的规则;一般来说,字符串的值为true,除了"0"和空字符串""的特殊情况,它们的类型转换为false。
在您的特定示例中,if ($myvar == "true")

  • 如果$myvar包含布尔值,则表达式的计算结果为(bool) == (bool)"true"(bool) == true
  • 如果$myvar包含一个整数,则将其转换为字符串并与字符串“true”进行比较;所以你的测试失败了因为是“1”=“true”。
  • 如果$myvar是一个字符串,字符串比较发生,突然只有文字字符串“true”将成功比较。

我猜第二和第三种情况是有效的:Wordpress可能在回发from时将$myval设置为字符串"true",因此您的测试通过。当您手动指定boolean true时,Wordpress必须将其转换为整数,然后进行整数比较并失败,因为整数1将在与"true"进行比较时转换为字符串"1"

t9aqgxwy

t9aqgxwy4#

您正在整数1和字符串'true'之间进行松散比较。对于这个PHP将把字符串转换成一个数字。'test'作为数字为0:

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

由于0不等于1,比较将返回false。
就像其他一些已经正确指出的答案一样,您应该针对boolean literalTRUEtrue进行测试。如果相等性检查中的一个运算符是布尔值,PHP将把另一个运算符也转换为布尔值,对于数字1,将给予

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

然后你的测试就通过了,因为真就等于真。
查看Type Comparison Table以了解PHP如何在testing for equality时处理类型。
至于check_update对布尔值的作用,请查看function description
(混合)(必需)此选项名称的NEW值。此值可以是字符串、数组、对象或序列化值。
所以,不允许布尔值。我试着简单地从源代码中找出转换发生的地方,但由于WP对我来说是一团糟,找不到它。就像其他人建议的那样,它可能发生在将其存储到数据库然后将其取回时。

hrirmatl

hrirmatl5#

所以,我有这个问题一段时间回来。在检查数据库后,我发现WordPress将configs和 meta的布尔值存储为string,因为数据库的结构中options.option_valuepostmeta.meta_valuelongtext。因此,当您查找它时,您将找到1的值或返回为''的空值。不要问我为什么他们这样做,我不能告诉你他们背后的理由是什么。
当你转换1和一个空字符串''时,你会得到:

<?php
var_dump((bool) 1)  // bool(true)
var_dump((bool) '') // bool(false)

我已经使用了类似下面的东西来测试布尔选项值:

<?php

global $options;

foreach ($options as $value) {
    // Notice how I cast the value as a boolean, before testing whether it is false.
    if (((bool) get_settings($value['id'])) === FALSE) { 
        $$value['id'] = $value['std']; 
    } else { 
        $$value['id'] = get_settings($value['id']);
    }
}
g6ll5ycj

g6ll5ycj6#

“true”是一个字符串,所有字符串都将求值为布尔值1(尝试强制转换(bool) $string。另一方面,true,没有引号,是一个布尔值,将计算为1。

相关问题