PHP8では、拡張機能も含む既存関数のパラメータの初期値や期待する型とリターン値が変わるものがあります。
リターン値はif文などで判定をしているところは注意が必要です。とくに、処理が失敗したときのfalseを返さなくなったものは。
パラメータは気にするところは少ないかな。
PHPは、ネイティブの関数と拡張機能の関数が用意されていますが、PHP8ではそれらの関数のパラメータとリターン値が変わってるものがあります。
具体的に列挙していくのが困難なほどたくさんあるので全部を紹介できませんが、公式ドキュメントの変更履歴で公開されているので確認しましょう。
パラメータは初期値やデータの型が変わってるものがありますがあまり気にしなくていいです。
データの型が変わったのものは、そもそもその機能自体の変更点が多いので、確認漏れが起きることは少ないでしょう。
初期値ではnullが指定されているものが多いです。処理がエラーになるほどの致命的なことは少ないでしょう。
ただし、ユニットテスト(単体テスト)は必要でしょうね? これらの変更は机上だけで問題ないことを担保することは難しいです。
じっさいにテストしてみないと何が起きるのか分かりません。
リターン値でエラーのfalseを返さなくなる関数がある
ここの話で一番修正が必要になるかもしれないところは、リターン値で期待したものが返ってこないときです。
PHP8では、関数がエラーになったときにfalseを返していたのを辞めたものがあります。
たとえばsubstr()。結構オーソドックスな関数。
<?php
$result = substr('a', 2);
var_dump($result);
if (false === $result) {
echo "result === false" . PHP_EOL;
}
if (false == $result) {
echo "result == false" . PHP_EOL;
}
if (empty($result)) {
echo "empty" . PHP_EOL;
}
php substr.php
bool(false)
result === false
result == false
empty
php80 substr.php
string(0) ""
result == false
empty
falseの厳密な比較(===)でエラー処理を書いているとき、そこに入っていきません。
小さな変更ですがナメたらとんでもない目に合いそう。やっぱりテストが必要ですね?
PHP7とPHP8の両方に対応するためにはempty()を使えばいい。
ゆるいfalseの比較はしないほうがいいです。仕様としてfalseを返さなくなってるので意味が分からなくなるから。
そもそもPHP8の重要変更点のひとつに型の厳密化があります。Javaなどのように型一致を求めるようになってるので、その考え方からも使うべきではありません。