我有以下代码来查看分配的时间是否已经过去。对于我的演示,它应该全部评估为false,不应该发生任何事情。发生的事情是,它解析为true,即使在inf中,我也将其与>=进行比较
为什么我会有这种奇怪的行为?
$data = '[{"ip":"80.61.150.173","endtime":1343988643},{"ip":"80.61.150.173","endtime":1343988649},{"ip":"80.61.150.173","endtime":1343988650},{"ip":"80.61.150.173","endtime":1343988664},{"ip":"80.61.150.173","endtime":1343988682},{"ip":"80.61.150.173","endtime":1343988723}]';
$json = json_decode($data,true);
foreach($json as $key => $obj)
{
var_dump($obj);
echo "<BR>";
var_dump(time());
echo "<BR>";
if($obj['endtime'] <= time());
{
echo "<BR>bliep<P>";
}
}
此代码评估为以下结果:
array(2){["ip"]=>string(13)"80.61.150.173"["endtime"]=>int(1343988643)}
int(1343981967)bliep数组(2){["ip"]=>字符串(13)"80.61.150.173"["endtime"]=>int(1343988649)}
int(1343981967)bliep
array(2){["ip"]=>string(13)"80.61.150.173"["endtime"]=>int(1343988650)}
int(1343981967)bliep
array(2){["ip"]=>string(13)"80.61.150.173"["endtime"]=>int(1343988664)}
int(1343981967)bliep
array(2){["ip"]=>string(13)"80.61.150.173"["endtime"]=>int(1343988682)}
int(1343981967)bliep
array(2){["ip"]=>string(13)"80.61.150.173"["endtime"]=>int(1343988723)}
int(1343981967)bliep
正如你所看到的,那里有所有不应该出现的小插曲。时间戳为int,当前时间小于保存的时间。它应该很容易比较,但它总是评估为true,而现在是<而不是存储的时间戳。
这是怎么回事?
它不是我的服务器,因为此代码在http://writecodeonline.com/php/
如果您的if
语句的末尾有一个拼写错误;
。
应该是
if($obj['endtime'] <= time());
而不是
if($obj['endtime'] <= time())
因为
if($obj['endtime'] <= time());
应该是
if($obj['endtime'] <= time())//without the semicolon
虽然你有答案,但我想知道它为什么没有出错会很好。
本质上,if($obj['endtime'] <= time());
被解释为短或一行if语句:
if($obj['endtime'] <= time())
echo 'foo';
else
echo 'bar';
但是,由于if
语句和分号之间没有语句,php将继续执行,而忽略大括号(相当令人恼火的IMO)。我不确定,但如果你在下一行有一个else{}
,你可能会得到一个错误
一个很好的例子说明了如何支持各种语法会让您头疼不已。也就是说,我喜欢你的编码风格,在新行中保持开头和结尾的卷曲。提高可读性IMHO。