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

有帮助吗?

解决方案

尝试

if($myvar == true)

$myvar = true;

TRUEFALSE是PHP的内置布尔变量它们是不是一个真正的串更为普遍。


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

其他提示

尝试

if ($myvar)

不测试的东西是否“等于”真,它们或者是真或它们不是。

您应该将第一个测试更改为 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 可能正在设置 $myval 到字符串 "true" 当发回后,你的测试就通过了。当您手动指定布尔值时 true, ,Wordpress 必须将其转换为整数,然后进行整数比较并失败,因为整数 1 将被转换为字符串 "1" 当比较时 "true".

您正在做整数1和字符串“真”之间的松散比较。对于这个PHP将转化的字符串到数字。 '测试' 作为一个数为0:

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

和自0不等于1时,比较将返回false。

就像已经正确地指出了一些其他的答案,你应该测试针对的布尔值 TRUEtrue。如果在相等性检查一个操作员是一个布尔,PHP将转换其他操作员为布尔值太,其中对于数字1,将给出

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

和然后测试将通过,因为真正等于真。

查看类型比较表以理解PHP怎样改变类型时测试对于平等

至于什么check_update不给你的布尔,请查看功能描述

  

(混合)(必需)NEW对于此选项名称值。该值可以是一个字符串,一个数组,一个物体或序列化值。

所以,没有布尔允许的。我试图简单地从源代码<查出/ A>,其中发生转换,但由于WP是一个烂摊子给我,找不到它。就像别人的建议,它可能恰好将其存储到数据库时,然后得到它回来。

“真”是一个字符串,所有字符串evaulates为布尔1(试穿另一方面铸造(bool) $stringtrue,不带引号,是一个布尔值,实际等于1。

scroll top