2010-02-26 45 views
1

编辑:我相信我的混淆可能是由我在测试该选项的值的页面顶部的此代码创建的......这会创建一个快捷方式来引用不使用get_option(“选项”)方法选项...布尔值在PHP中变为数字

global $options; 
foreach ($options as $value) { 
if (get_settings($value['id']) === FALSE) { 
     $$value['id'] = $value['std']; 
    } else { 
     $$value['id'] = get_settings($value['id']); 
    } 
} 

因此,当我设置一个变量,$ MYVAR的价值,通过我的主题的选项面板中选中和复选框单击保存,然后查看我的options.php在worpdress中,变量的值是

true 

而当我做了查找这个变量使用

if($myvar == "true") 

它通过。

然而,当我经由update_options值直接设置()方法,像这样从...真实1

$mvar = true; 
update_option('myvar', $myvar); 

的值的变化而当我做同样的比较,因为之前,如果($ myvar ==“true”),它现在失败。它不再是“真实的”。

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

+0

@Scott:请正确地标题。这将有助于其他人(将来)找到类似问题的解决方案。按照我的理解,我编辑了标题。如果您认为它没有正确表达,请纠正它。 – shahkalpesh 2010-02-26 18:05:55

+0

会做。我想你已经重申了它的好处。我对这个标题感到很开心:)但我明白你的观点。 – 2010-02-26 18:16:54

+0

只是为了好玩,原题是什么? – 2010-02-26 18:58:48

回答

5

尝试

if($myvar == true) 

$myvar = true; 

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


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

+0

看到我上面的编辑。我认为这对我造成了问题... – 2010-02-26 18:13:22

+1

-1:'true'不是设置为'1'的常量。 'true'是一种语言结构。为什么'true == 1'是因为唯一被认为是false的整数是'0'。因此,'true == -1','true == 3','true == 978213','true!= 0'等请参阅http://php.net/boolean – 2010-02-26 18:43:26

+0

而实际上,当我运行'get_defined_constants',我得到'[“TRUE”] => bool(true),[“FALSE”] => bool(false)'on 5.2.12 ... – 2010-02-26 18:50:20

-2

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

+2

不正确;当转换为bool时,字符串等同于“True”,除了字符串“0”和空字符串“”,它们是假的。 – meagar 2010-02-26 18:04:30

+0

@meagar,谢谢你太快了(编辑。) – chelmertz 2010-02-26 18:09:00

1

尝试

if ($myvar) 

不要测试是否事“平等”真的,他们是真还是他们没有。

+0

这是可怕的做法。在这种情况下,PHP会尝试自动转换变量,即使它不是,它也会返回true。您的代码段将针对0,false或null之外的任何内容返回true。这可能在这种情况下工作,但是做错了。 – 2010-02-26 18:17:42

+0

关于wordpress而言,这可能是一种可怕的做法,但是在一个写得很好的应用程序中,您将标志或选项视为布尔值,这将是比较它的方式。不幸的是,从数据库中提取数据后,wordpress不会将它们转换为布尔值,并且您将面临一个弱类型的混乱。 – 2010-02-26 18:39:26

+1

@Alex,你是对的,这正是为什么这是正确的形式。如果你在if语句中抛出它之前不知道变量是否是布尔值,那么98%的时间你做错了(而另外的2%你只在变量被设置为所有,这意味着无论如何,裸“if”是正确的)。 – 2010-02-26 18:58:47

0

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

在你的具体的例子,if ($myvar == "true")

  • 如果$myvar包含布尔,表达式会作为(bool) == (bool)"true",或者(bool) == true
  • 如果$myvar包含一个整数,它转换为字符串比较反对字符串“true”;所以你的测试失败了,因为“1”!=“true”。
  • 如果$myvar是一个字符串,则会进行字符串比较,并且突然只有字符串“true”才会成功进行比较。

我猜第2和第3例,均效果:WordPress是有可能设置$myval字符串"true"当从回发,让你的测试通过。当您手动指定布尔型true时,Wordpress必须将其转换为整数,然后进行整数比较并失败,因为与"true"进行比较时,整数1将转换为字符串"1"

0

您正在对整数1和字符串'true'进行宽松比较。对于这个PHP会将字符串转换为数字。 'test'as number is is 0:

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

而且由于0不等于1,比较将返回false。

像其他一些答案已经正确指出,你应该测试对boolean literalTRUEtrue。如果在一个平等检查一个操作符是一个布尔值,PHP将转换为其他运营商的布尔过,这对于数字1,会给

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

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

查看Type Comparison Table了解PHP如何处理类型的杂耍类型。

至于什么check_update不会向你的布尔值,检查出function description

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

所以,不允许布尔值。我试着简单地从sourcecode中找到转换发生的地方,但是由于WP对我来说很混乱,找不到它。像其他人所建议的那样,将它存储到数据库然后恢复时可能会发生。