Странное поведение PHP: не присвоит целое число 8 переменной - PullRequest
0 голосов
/ 25 августа 2009

Я думаю, что только что столкнулся с самой странной «ошибкой», с которой я когда-либо сталкивался в моей короткой жизни разработчика Кажется, я просто не могу присвоить значение восемь какой-либо переменной. Для примера:

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

echo $seven;
echo $eight;
echo $sevenB;
echo $eightB;
?>

Вывод:

7078

Отладчик в NetBeans сообщает, что 0 назначен на восемь долларов, в то время как с другими переменными все в порядке. Если я удаляю нули перед значениями, присваивается восемь, но как только эта переменная используется в конструкторе, она снова заменяется на ноль. WTF?

Вот мой конфиг: WAMP 2.0g, PHP 5.2.9, Apache 2.2.11, NetBeans 6.7.1. Отключение Xdebug (2.05) ничего не меняет.

Кто несет ответственность за это непоследовательное поведение? Как это исправить?

Спасибо за вашу помощь!

Ответы [ 5 ]

20 голосов
/ 25 августа 2009

PHP обрабатывает числа с предшествующим 0 как восьмеричное.

Re: PHP: целые числа .

9 голосов
/ 25 августа 2009

В PHP число, которому предшествует ноль, считается восьмеричным. Поскольку восьмеричное (основание 8) имеет только цифры 0-7, значение 08 недопустимо и рассматривается как ноль.

См. эту страницу руководства для получения дополнительной информации и обратите внимание на предупреждение в разделе синтаксиса: «Если недопустимая цифра дается в восьмеричном целом (т. Е. 8 или 9), остальная часть игнорировать ".

<?php
var_dump(01090); // 010 octal = 8 decimal
?>
6 голосов
/ 25 августа 2009

если вы ставите перед цифрами ноль (0), они интерпретируются как восьмеричные числа. 7 - высшее восьмеричное число. также есть 0x для шестнадцатеричных чисел (до 15 / F)

как исправить: просто не используйте префикс 0;)

0 голосов
/ 25 августа 2009

(s) printf - единственный верный способ сделать это.

0 голосов
/ 25 августа 2009

Если вы хотите привести число с нулем (как календарь месяца), вы можете попробовать что-то вроде этого:

<?
   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>";
?>

Похоже, все остальные также заявили, что число, начинающееся с нуля, рассматривается как восьмеричное

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...