2009-08-25 4 views
0

私はちょうど私の短い開発者の生活の中で遭遇した最も奇妙な 'バグ'に遭遇したと思います。任意の変数に値8を代入することはできないようです。 exempleについて:奇妙なPHPの振る舞い:変数に整数8を代入しません

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

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

出力は次のとおりです。

7078 

NetBeansでデバッガは、他の変数が細かいながら0は、$ 8個に割り当てられていると言われます。 値の前にゼロを削除すると、8個の変数が割り当てられますが、この変数がコンストラクタで使用されるとすぐにゼロに置き換えられます。 WTF?

私の設定はWAMP 2.0g、PHP 5.2.9、Apache 2.2.11、NetBeans 6.7.1です。 Xdebug(2.05)を無効にしても、何も変わりません。

この一貫性のない動作は誰が責任を負いますか?これを修正するには?

ありがとうございました!

+1

はい、私は複製できます。それは8進数とか何かと解釈されますか? –

+0

エコー070;収入56 .... –

+2

**あなたは**この "矛盾した"行動を担当しています! :p –

答えて

20

PHPは先行する0の数値を8進数として扱います。

Re:PHP:Integers

6

数字の前に0を付けた場合、数字は8進数として解釈されます。 7は最高の8進数です。 16進数のための0xを解決する方法

(15/Fまで)もあります:ちょうど0に接頭辞はありません。)

9

はPHPで、ゼロで始まるの番号は8進数であると考えられています。 8進数(基数8)は0〜7の数字しかないため、08は無効でゼロとして扱われます。

詳細については、を参照してください。また、「8桁または9桁の8進整数で無効な桁が指定された場合、残りの数字は無視されます。

<?php 
var_dump(01090); // 010 octal = 8 decimal 
?> 
0

あなたは(月のカレンダーと同じように)ゼロで多数を導くために探している場合、あなたはこのような何かを試みることができる:

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

を他の皆もゼロでリード数が扱われていると述べたように見えますオクタルとして

+1

またはより簡潔に: echo sprintf( '%02s'、$ num); – rooskie

0

(s)printfがこれを行う正しい方法です。