2009-08-25 9 views
0

Je pense que je viens de rencontrer le plus étrange "bug" que j'ai jamais rencontré dans ma courte vie de développeur. Il semble que je ne peux pas attribuer la valeur huit à une variable. Pour exemple:Comportement bizarre PHP: n'attribuera pas l'entier 8 à une variable

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

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

La sortie est:

7078 

Le débogueur dans NetBeans me dit 0 est affecté à huit $, tandis que les autres variables sont très bien. Si je supprime les zéros avant les valeurs, huit sont affectés, mais dès que cette variable est utilisée dans un constructeur, elle est à nouveau remplacée par zéro. WTF?

Voici ma config: WAMP 2.0g, PHP 5.2.9, Apache 2.2.11, NetBeans 6.7.1. La désactivation de Xdebug (2.05) ne change rien.

Qui est responsable de ce comportement incohérent? Comment régler ceci?

Merci pour votre aide!

+1

Oui, je peux répliquer. L'interprète-t-il comme octal ou quelque chose? –

+0

echo 070; donne 56 ... –

+2

** Vous ** êtes responsable de ce comportement "inconsistant"! : p –

Répondre

20

PHP traite les nombres avec un 0 précédent en octal.

Re: PHP:Integers.

6

Si vous préfixez vos numéros avec un zéro (0), ils sont interprétés comme des nombres octaux. 7 est le nombre octal le plus élevé. il y a aussi 0x pour les nombres hexadécimaux (jusqu'à 15/F)

comment résoudre: il suffit de ne préfixe pas 0;)

9

En PHP, un nombre qui est préfacé par un zéro est considéré comme octal. Parce que octal (base 8) a seulement les chiffres 0-7, 08 est invalide et traité comme zéro. Pour plus d'informations, voir this manual page et notez l'avertissement dans la section de syntaxe: "Si un chiffre invalide est donné dans un entier octal (c'est-à-dire 8 ou 9), le reste du nombre est ignoré."

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

Si vous cherchez à conduire un certain nombre zéro (comme un calendrier de mois), vous pouvez essayer quelque chose comme ceci:

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

On dirait que tout le monde a également déclaré qu'un nombre premier zéro est traité Comme Octal

+1

Ou de façon plus concise: echo sprintf ('% 02s', $ num); – rooskie

0

(s) printf est la seule bonne façon de le faire.

Questions connexes