怪异的PHP行为:赢得';t将整数8赋给变量

怪异的PHP行为:赢得';t将整数8赋给变量,php,debugging,variables,Php,Debugging,Variables,我想我刚刚遇到了在我短暂的开发者生涯中遇到的最奇怪的“bug”。看起来我就是不能给任何变量赋值。例如: <?php $seven = 07; $eight = 08; //what's wrong here? $sevenB = 7; $eightB = 8; echo $seven; echo $eight; echo $sevenB; echo $eightB; ?> NetBeans中的调试器告诉我0被分配给$8,而其他变量则没有问题。 如果我在值之前去掉零,就会赋值8,但

我想我刚刚遇到了在我短暂的开发者生涯中遇到的最奇怪的“bug”。看起来我就是不能给任何变量赋值。例如:

<?php
$seven = 07;
$eight = 08; //what's wrong here?
$sevenB = 7;
$eightB = 8;

echo $seven;
echo $eight;
echo $sevenB;
echo $eightB;
?>
NetBeans中的调试器告诉我0被分配给$8,而其他变量则没有问题。 如果我在值之前去掉零,就会赋值8,但是一旦在构造函数中使用这个变量,它就会再次被零替换。WTF

这是我的配置:WAMP 2.0g、PHP5.2.9、Apache2.2.11、NetBeans 6.7.1。 禁用Xdebug(2.05)不会改变任何事情

谁对这种不一致的行为负责?如何解决这个问题


谢谢你的帮助

PHP将前面有0的数字视为八进制


回复:。

如果您在数字前加上零(0)前缀,它们将被解释为八进制数字。7是最高的八进制数。十六进制数也有0x(最多15/F)


如何修复:只需不使用前缀0;)

在PHP中,以零开头的数字被认为是八进制。因为八进制(以8为基数)只有数字0-7,所以08无效并被视为零

有关更多信息,请参阅,并注意语法部分中的警告:“如果八进制整数(即8或9)中给出了无效数字,则忽略数字的其余部分。”


如果您希望以零(如月历)领先一个数字,您可以尝试以下方法:

<?
   for ($num = 1; $num <= 31; $num++) {
   if($num<10)
      $day = "0$num"; // add the zero
   else
      $day = "$num"; // don't add the zero
   echo "<p>$day</p>";
?>

printf是唯一正确的方法

是的,我可以复制。它是把它解释成八进制还是什么;收益率56…您应对这种“不一致”的行为负责!:感谢你们帮助一个新手摆脱了打字语言薄弱的困境!或者更简洁地说:echo sprintf('%02s',$num);
<?php
var_dump(01090); // 010 octal = 8 decimal
?>
<?
   for ($num = 1; $num <= 31; $num++) {
   if($num<10)
      $day = "0$num"; // add the zero
   else
      $day = "$num"; // don't add the zero
   echo "<p>$day</p>";
?>