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?
答案 0 :(得分:5)
尝试
if($myvar == true)
和
$myvar = true;
TRUE
和FALSE
是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 TRUE
或true
进行测试。如果等式检查中的一个运算符是布尔值,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) $string
。true
另一方面,没有引号,是一个布尔值,将评估为1。 / p>