编辑:我相信我的困惑可能是由页面顶部的代码造成的,我正在测试选项的值...这将创建一个快捷方法来引用该选项,而无需使用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?
6条答案
按热度按时间ykejflvf1#
试试看
和/或
TRUE
和FALSE
是PHP内置的布尔变量,比真正的字符串更通用。关于update_option。可能不是选项将其更改为1。相反,当它将其插入数据库时,它可能会将其作为字符串
"true"
插入。然后,当返回时,它被转换为布尔值true
,打印时为1
rjjhvcjd2#
试试看
不要测试事物是否“等于”真,它们要么是真的,要么不是。
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"
,因此您的测试通过。当您手动指定booleantrue
时,Wordpress必须将其转换为整数,然后进行整数比较并失败,因为整数1将在与"true"
进行比较时转换为字符串"1"
。t9aqgxwy4#
您正在整数1和字符串'true'之间进行松散比较。对于这个PHP将把字符串转换成一个数字。'test'作为数字为0:
由于0不等于1,比较将返回false。
就像其他一些已经正确指出的答案一样,您应该针对boolean literal
TRUE
或true
进行测试。如果相等性检查中的一个运算符是布尔值,PHP将把另一个运算符也转换为布尔值,对于数字1,将给予然后你的测试就通过了,因为真就等于真。
查看Type Comparison Table以了解PHP如何在testing for equality时处理类型。
至于
check_update
对布尔值的作用,请查看function description:(混合)(必需)此选项名称的NEW值。此值可以是字符串、数组、对象或序列化值。
所以,不允许布尔值。我试着简单地从源代码中找出转换发生的地方,但由于WP对我来说是一团糟,找不到它。就像其他人建议的那样,它可能发生在将其存储到数据库然后将其取回时。
hrirmatl5#
所以,我有这个问题一段时间回来。在检查数据库后,我发现WordPress将configs和 meta的布尔值存储为
string
,因为数据库的结构中options.option_value
和postmeta.meta_value
是longtext
。因此,当您查找它时,您将找到1
的值或返回为''
的空值。不要问我为什么他们这样做,我不能告诉你他们背后的理由是什么。当你转换
1
和一个空字符串''
时,你会得到:我已经使用了类似下面的东西来测试布尔选项值:
g6ll5ycj6#
“true”是一个字符串,所有字符串都将求值为布尔值1(尝试强制转换
(bool) $string
。另一方面,true
,没有引号,是一个布尔值,将计算为1。