web-dev-qa-db-ja.com

解析エラー:無効な数値リテラル

このコードを実行中に次のエラーが発生しました。

コード:

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

エラー:

解析エラー:無効な数値リテラル。

この問題が発生した理由とこれを解決するにはどうすればよいですか?

15
Rana Ghosh

これは、PHP7での整数(特に8進数)の処理方法(PHP5とは異なります)に加えられた変更によるものです。

ドキュメントから(PHP7移行から)

無効な8進リテラル

以前は、無効な数値を含む8進リテラルは暗黙的に切り捨てられました(0128は012と見なされていました)。現在、無効な8進リテラルは解析エラーを引き起こします。

整数のドキュメントから

PHP 7の前に、無効な数字が8進整数(8または9)で与えられた場合、残りの数字は無視されました。PHP 7、解析エラーが出力されます。

それらを文字列として使用するか、実際の整数として使用します

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

これは、0で始まるすべての数値が8進数値と見なされるためです。8桁の場合、位置ごとに上限(0〜7)があります。 PHPマニュアル に記載されているように、無効な数字を静かにドロップする代わりに、現在(7.x)は上記の警告を生成します。

なぜあなたはそのような数字を書いているのですか?先行ゼロが重要な場合、それはあなたが持っている数字ではなく、文字列です。それらを数値であるかのように計算する必要がある場合は、値をクライアントに出力するときに先行ゼロを追加する必要があります。
これは、次のようにprintf()またはsprintf()で実行できます。

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

他の例についてはマニュアルをご覧ください

0
ChristianF

明らかに有効な数値リテラルが無効な数値リテラルとして検出されている場合があります。

これはphp5.4以降の回帰です

これを修正するには、配列を次のように変更します。

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

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

リファレンス: https://bugs.php.net/bug.php?id=7019

0
Ashish Kumar