web-dev-qa-db-fra.com

Erreur d'analyse: littéral numérique non valide

J'ai l'erreur suivante lors de l'exécution de ce code ci-dessous:

Code:

<?php
    $a = array(00001, 00008, 00009, 00012);
    print_r($a);
?>

Erreur:

Erreur d'analyse: Littéral numérique non valide.

Pourquoi ce problème est survenu et comment résoudre ce problème?

12
Rana Ghosh

Cela vient des modifications apportées à la façon dont les entiers, en particulier les octaux, sont gérés en PHP7 (contrairement à PHP5).

De la documentation (de la migration de PHP7)

Littéraux octaux invalides

Auparavant, les littéraux octaux contenant des nombres non valides étaient tronqués de manière silencieuse (0128 était pris comme 012). Maintenant, un littéral octal non valide provoquera une erreur d'analyse.

De la documentation des entiers

Avant PHP 7, si un chiffre non valide était indiqué dans un entier octal (8 ou 9), le reste du nombre était ignoré. Depuis PHP 7, une erreur d'analyse est émise.

Soit les utiliser comme des chaînes, ou des entiers réels

$a = array(1, 8, 9, 12); // Integers
$a = array("00001", "00008", "00009", "00012"); // Strings
16
Qirel

En effet, tous les nombres commençant par 0 sont considérés comme des valeurs octales, avec une limite supérieure de 8 chiffres par position (0-7). Comme indiqué dans le manuel PHP , au lieu de supprimer en silence les chiffres non valides, ils produisent maintenant (7.x) l'avertissement ci-dessus.

Pourquoi écrivez-vous vos chiffres comme ça? Si les zéros au début sont significatifs, alors ce n’est pas un nombre mais une chaîne. Si vous devez effectuer des calculs sur ceux-ci comme s'il s'agissait de nombres, vous devez ajouter les zéros au début lorsque vous transmettez les valeurs au client.
Cela peut être fait avec printf() ou sprintf() comme ceci:

$number = 5;
printf ("%05$1d", $number);

Veuillez voir le manuel pour plus d'exemples .

0
ChristianF

Parfois, un littéral numérique apparemment valide est détecté en tant que littéral numérique invalide.

Ceci est une régression depuis php5.4

Vous pouvez résoudre ce problème en modifiant le tableau en:

$a =array(1,8,9,12);   

$a = array('0001','0008','0009','0012'); //alternative method for fix

Référence: https://bugs.php.net/bug.php?id=70193

0
Ashish Kumar