PHPでDeprecated:  Implicit conversion from float xxx to int loses precision in … のエラーが出る

業務でPHPの知識が必要になりそうなので、PHPの学習を始めました。
学習に使っている書籍はこちら。

created by Rinker
¥3,740 (2024/05/29 20:52:16時点 Amazon調べ-詳細)

PHPのバージョンですが、独習PHP 第4版では8.0.3が動作確認環境になっています。

私も環境構築時に同じバージョンにしても良かったのですが、せっかくなので極力新しいバージョンで学んでみようというのと、8.x系がベースならそれほど大きな差はなく、書籍を使っての学習にも支障は出ないのでは、と思い8.1をベースにしたdockerイメージを使った開発環境を構築しました。

Deprecated:  Implicit conversion from float 10.5 to int loses precision in …

書籍を読み進めながらサンプルコードを入力・実行すると見出しの警告が発生しました。
入力ミスかな?と思い、書籍とコードを比較してみましたが、誤りと思える箇所は見つからず。

1行1行デバッグしながら確認をしてくと、次の箇所が警告の原因だと特定できました。

<?php
// キーは整数値/文字列に変換される
$data = [
  ...
  10.5 => 3,
  ...
];
(...はコードを省略した表記としています)

連想配列のキーにあたる”10.5″が、暗黙で整数に変換される箇所です。

8.1.xから暗黙の変換が非推奨に

PHPの公式ドキュメントにありました。

精度を損なうことになる float から int への暗黙の変換は、 推奨されなくなりました。 これは配列のキーに float を使った場合や、 型の自動変換 (coerciveモード) 時に int 型を宣言した場合や、 int に対して演算子を適用する場合に影響します。

https://www.php.net/manual/ja/migration81.deprecated.php

書籍のPHPのバージョンは8.0.3なので暗黙の変換が行われていたのですが、
私の環境では8.1のため、非推奨の警告が表示されてしまっていました。

学習時のバージョンの差異によるエラー・警告が出た場合は

読んでいる書籍で紹介されているバージョンよりも新しいバージョンを使って学習または開発を行っている時にエラーや警告が出た場合は、公式ドキュメントの移行情報を参照してみると解決のヒントが得られるかもしれません。

ご参考までに。