php switch 为啥 bool TRUE 被判断为了 int 1,NULL 成了 string '',而 bool FALSE 正常?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php switch 为啥 bool TRUE 被判断为了 int 1,NULL 成了 string '',而 bool FALSE 正常?相关的知识,希望对你有一定的参考价值。

全部代码在此(我测过,问题如上所示,有什么办法可以解决吗?):

<?php
function web_value_to_data($var)
switch (TRUE)
case is_null($var) :
return web_null_to_data($var);
break;
case is_bool($var) :
return web_bool_to_data($var);
break;
case is_int($var) :
return web_int_to_data($var);
break;
case is_float($var) :
return web_float_to_data($var);
break;
case is_string($var) :
return web_string_to_data($var);
break;
case is_array($var) :
return web_array_to_data($var);
break;
default :
return FALSE;


function web_null_to_data($var)
return (is_null($var) ? 'nullptr NULL' : FALSE);

function web_bool_to_data($var)
return 'bool ' . (($var === TRUE) ? 'TRUE' : 'FALSE');

function web_int_to_data($var)
return (is_int($var) ? 'int ' . strval($var) : FALSE);

function web_float_to_data($var)
return (is_float($var) ? 'float ' . strval($var) : FALSE);

function web_string_to_data($var)
return (is_string($var) ? 'string \'' . addslashes($var) . '\'' : FALSE);

function web_array_to_data($var)
if (!is_array($var))
return FALSE;


$data = 'array [' . "\r\n";
foreach ($var as $key => $value)
$data .= web_value_to_data($key) . ' > ';
$data .= web_value_to_data($value);
$data .= "\r\n";

$data .= ']';

return $data;

?>
测试代码如下,t.php是问题补充贴的代码:
<?php
require('t.php');
$v=array(
1=>0,
TRUE=>'\\\'',
'a'=>array(4=>9),
NULL=>FALSE);
echo web_array_to_data($v);
?>
输出
array [
int 1 > string '\\\''
string 'a' > array [
int 4 > int 9
]
string '' > bool FALSE
]
FALSE正常
即使switch是弱比较 那is_null(),is_bool()应该是强比较吧?

php是弱类型语言,true是==1的,false是==0的,但是还有一个符号是===恒等于,会加上类型的判断,就不会相等了,两个==的相等,会先将类型进行转换,再判断。你把你使用的例子给贴出来吧,不太明白你对哪里有疑问。追问

测试代码看问题补充(已经加上了),这里贴不下。

追答

php数组的键只能是一个整数 integer 或字符串 string,所以Bool类型的,会先被转换为这两种类型,TRUE被转换成了1,NULL被转换成了空'';TRUE转为1之后,覆盖了前面的1=>0;转换了之后,才进行存储的,所以在你foreach使用时候,类型已经被转换了,你可以在echo web_array_to_data($v);
之前,打印一下$v,就可以看到了。

追问

那为什么bool FALSE正常呢(这样应该FALSE为0吧)?真是奇怪呢>_<

追答

因为那是数组的值,数组对值没有限制类型,只对键做了限制和转换。

参考技术A 环境设置问题?

为啥 ?XDEBUG_PROFILE=true 被 mod_rewrite 忽略?

【中文标题】为啥 ?XDEBUG_PROFILE=true 被 mod_rewrite 忽略?【英文标题】:Why is ?XDEBUG_PROFILE=true being ignored by mod_rewrite?为什么 ?XDEBUG_PROFILE=true 被 mod_rewrite 忽略? 【发布时间】:2011-08-17 14:08:01 【问题描述】:

我已将 xdebug 安装到我的 PHP 中,并希望在 url 字符串中使用 ?XDEBUG_PROFILE=true 来执行分析器。但是,当我尝试使用具有带有查询字符串的 mod_rewrite RewriteRule 的 url 执行此操作时,它不会配置文件。示例:

RewriteRule ^page/(.*)/last$       page.php?pageid=$1 [L]

实现此功能的最佳方法是什么?

【问题讨论】:

【参考方案1】:

您需要添加[QSA] 标志以将任何查询字符串附加到重写。

RewriteRule ^page/(.*)/last$       page.php?pageid=$1 [L,QSA]

只允许XDEBUG_PROFILE:

RewriteCond %QUERY_STRING ^XDEBUG_PROFILE
RewriteRule ^page/(.*)/last$       page.php?pageid=$1&XDEBUG_PROFILE=1 [L]

# Other requests go through as normal
RewriteRule ^page/(.*)/last$       page.php?pageid=$1 [L]

【讨论】:

谢谢,但我不太喜欢它的声音。这是否意味着任何人都可以将任何查询字符串传递给我的脚本?从而向黑客开放了 GET 变量。 @David 然后试试我刚刚添加的内容。不允许任何查询参数,但 XDEBUG_PROFILE 是。在任何情况下,您都可以在完成分析后删除 QSA,因为无论如何您都应该在生产中禁用 xdebug。 @david:没有什么能阻止某人在他们的地址栏中输入example.com/yourscript?hahah=im_in_url_url&amp;adding=stuffz

以上是关于php switch 为啥 bool TRUE 被判断为了 int 1,NULL 成了 string '',而 bool FALSE 正常?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 `bool?` 上没有解除短路运算符?

Mysql BOOL 字段应该使用哪些值:TRUE/FALSE 或 1/0,为啥?

Switch

为啥两个向量的大小<bool> bVec = true,false,true,false,true;向量<char> cVec = 'a', 'b', 'c', 'd',

这个PHP流程判断switch语句哪里出错了?为啥不执行default后面的语句

js和php对bool值的判断区别