PHPでは「123 == 0123」は成り立つのか?先頭ゼロと8進数リテラルの仕組みを解説
結論:等しくありません
PHPにおいて 123 == 0123 はfalse(偽)になります。その理由は、0123 が単なる「123」ではなく、8進数(基数8)の表記だからです。8進数の 0123 を10進数に変換すると 83 となり、123 とは異なる値になるため、両者は等しくなりません。
先頭の「0」は8進数を意味する
PHPでは、整数リテラルの先頭に 0 を付けると、その数値は8進数(octal)として解釈されます。これは、先頭に 0x を付けると16進数(hexadecimal)として扱われるのと同じルールです。
123→ 10進数の 1230123→ 8進数の 123(= 10進数の 83)0x1A→ 16進数の 1A(= 10進数の 26)
コード例で確認する
実際に var_dump() を使って挙動を見てみましょう。
var_dump(123); var_dump(0123); var_dump(123 == 0123);
出力結果
int(123) int(83) bool(false)
0123 には先頭に 0 が付いているため8進数表記とみなされ、10進数の 83 として評価されます。一方、123 は通常の10進数なので、比較結果は false となります。
無効な桁を含む場合はどうなる?
8進数で使える数字は 0〜7 のみです。では、8進数として無効な 8 や 9 を含むリテラルを書くとどうなるのでしょうか。次のコードを見てください。
var_dump(79); var_dump(079);
出力結果
int(79) int(7)
079 は8進数としては無効な 9 を含まない場合、PHPのパーサーは有効な桁(7)までを読み取った時点で解釈を打ち切るため、結果は 7 になります。意図しないバグを防ぐためにも、先頭ゼロ付きの数値リテラルには注意が必要です。
補足:PHP 8.1以降の明示的な8進数表記
PHP 8.1以降では、0o / 0O を使った明示的な8進数表記が導入されました(例:0o123)。こちらも10進数では 83 として評価されます。可読性の観点から、8進数を意図的に書きたい場合は 0o 表記を使うと、先頭ゼロによる暗黙的な解釈との混同を避けられます。
まとめ
123 == 0123は false。0123は8進数で、10進数では 83 になるため。- 整数リテラルの先頭に
0を付けると8進数、0xを付けると16進数として解釈される。 - 8進数に無効な桁(8や9)を含めると、パースが途中で止まり予期しない値になる。
- PHP 8.1以降は
0o表記で明示的に8進数を書ける。
-
PHPのgregoriantojd()関数とは?構文・パラメータ・使用例を解説
PHPのgregoriantojd()関数は、グレゴリオ暦(現在広く使われている暦)の日付をユリウス通日(Julian Day Count)に変換し、その結果としてユリウス日番号を返す関数です。ユリウス通日は、天文学や歴史上の日付計算などで利用される連続した日数表現であり、異なる暦同士の日付比較や計算を簡単に行えるのが特徴です。 注意 − グレゴリオ暦として有効な範囲は、紀元前4714年11月25日から紀元9999年12月31日以降までとなっています。この範囲外の日付を指定すると、正しい結果が得られない場合があります。 構文 GregorianToJD(month, date, year)
-
PHPのfscanf()関数とは?使い方とフォーマット指定子を徹底解説
PHPのfscanf()関数は、オープン中のファイルから入力を読み込み、指定されたフォーマットに従って解析するための関数です。パラメータを2つだけ渡して呼び出した場合、解析結果の値が配列として返されます。基本構文fscanf(file_pointer, format, mixed)パラメータの詳細file_pointer − fopen()関数を使って作成されたファイルシステムポインタリソースを指定します。format − 読み込むデータの形式(フォーマット)を指定します。使用できる主なフォーマット指定子は以下の通りです。%% − パーセント記号(%)そのものを返す%b − 2進数として読み込