布尔值在PHP中变为数字

时间:2010-02-26 17:59:26

标签: php wordpress

编辑:我相信我的困惑可能是由我在测试选项值的页面顶部的代码创建的......这创建了一个快捷方法,可以在不使用get_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

当我进行与之前相同的比较时,如果($ myvar ==“true”),它现在失败了。它不再是“真实的”。

我错过了什么? (1)为什么是“true”和1,没有评估相同和(2)update_option方法对myvar的值做什么来将值从true更改为1?

5 个答案:

答案 0 :(得分:5)

尝试

if($myvar == true)

$myvar = true;

TRUEFALSE是PHP内置的布尔变量,它比真正的字符串更通用。


关于update_option。可能不是该选项将其更改为1.相反,它可能是在将其插入数据库时​​,它将其作为字符串"true"插入。然后,当它返回时,它将转换为布尔值true,打印时为1

答案 1 :(得分:1)

尝试

if ($myvar)

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

答案 2 :(得分:0)

您应该将第一次测试更改为if($myvar == true)或简单地if ($myvar)。 PHP对于什么是“真实”有一些奇怪的规则;通常,除了"0"和空字符串""的特殊情况之外,字符串都会被调整为true,其类型转换为false。

在您的具体示例中,if ($myvar == "true")

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

我猜第2和第3个案例有效:当发回来时,Wordpress可能会将$myval设置为字符串"true",因此您的测试通过了。当您手动指定布尔值true时,Wordpress必须将其转换为整数,然后进行整数比较并失败,因为与{{1}进行比较时,整数1将转换为字符串"1" }。

答案 3 :(得分:0)

你正在对整数1和字符串'true'进行松散的比较。为此,PHP会将字符串转换为数字。 'test'作为数字是0:

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

由于0不等于1,因此比较将返回false。

正如已经正确指出的其他答案一样,您应该针对boolean literal TRUEtrue进行测试。如果等式检查中的一个运算符是布尔值,PHP也会将另一个运算符转换为布尔值,对于数字1,它将给出

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

然后你的测试将通过,因为true等于true。

查看Type Comparison Table以了解当testing for equality时PHP juggles的输入方式。

至于check_update对布尔值的作用,请查看function description

  

(mixed)(必需)此选项名称的NEW值。该值可以是字符串,数组,对象或序列化值。

因此,不允许布尔值。我已经尝试过简单地从转换发生的sourcecode中找出,但由于WP对我来说是一团糟,所以无法找到它。像其他人建议的那样,它可能会在将其存储到数据库然后将其恢复时发生。

答案 4 :(得分:-2)

“true”是一个字符串,并且所有字符串都被调整为布尔值1(尝试转换(bool) $stringtrue另一方面,没有引号,是一个布尔值,将评估为1。 / p>