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数组的键只能是一个整数 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&adding=stuffz
。以上是关于php switch 为啥 bool TRUE 被判断为了 int 1,NULL 成了 string '',而 bool FALSE 正常?的主要内容,如果未能解决你的问题,请参考以下文章
Mysql BOOL 字段应该使用哪些值:TRUE/FALSE 或 1/0,为啥?
为啥两个向量的大小<bool> bVec = true,false,true,false,true;向量<char> cVec = 'a', 'b', 'c', 'd',