ツイート
シェア
LINEで送る
B! はてぶでブックマーク
Pocketでブックマーク
RSSフィード

PHP8, パラメータやリターン値が変わる関数。リターン値の判定は注意が必要。

php
イラストダウンロードサイト【イラストAC】
の画像をもとに加工しています。

PHP8では、拡張機能も含む既存関数のパラメータの初期値や期待する型とリターン値が変わるものがあります。

リターン値はif文などで判定をしているところは注意が必要です。とくに、処理が失敗したときのfalseを返さなくなったものは。

パラメータは気にするところは少ないかな。

PHPは、ネイティブの関数と拡張機能の関数が用意されていますが、PHP8ではそれらの関数のパラメータとリターン値が変わってるものがあります。

具体的に列挙していくのが困難なほどたくさんあるので全部を紹介できませんが、公式ドキュメントの変更履歴で公開されているので確認しましょう。

パラメータは初期値やデータの型が変わってるものがありますがあまり気にしなくていいです。

データの型が変わったのものは、そもそもその機能自体の変更点が多いので、確認漏れが起きることは少ないでしょう。

初期値ではnullが指定されているものが多いです。処理がエラーになるほどの致命的なことは少ないでしょう。

ただし、ユニットテスト(単体テスト)は必要でしょうね? これらの変更は机上だけで問題ないことを担保することは難しいです。

じっさいにテストしてみないと何が起きるのか分かりません。

リターン値でエラーのfalseを返さなくなる関数がある

ここの話で一番修正が必要になるかもしれないところは、リターン値で期待したものが返ってこないときです。

PHP8では、関数がエラーになったときにfalseを返していたのを辞めたものがあります。

たとえばsubstr()。結構オーソドックスな関数。

substr.php
<?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;
}
PHP7での実行結果
php substr.php
bool(false)
result === false
result == false
empty
PHP8の実行結果
php80 substr.php
string(0) ""
result == false
empty

falseの厳密な比較(===)でエラー処理を書いているとき、そこに入っていきません。

小さな変更ですがナメたらとんでもない目に合いそう。やっぱりテストが必要ですね?

PHP7とPHP8の両方に対応するためにはempty()を使えばいい。

ゆるいfalseの比較はしないほうがいいです。仕様としてfalseを返さなくなってるので意味が分からなくなるから。

そもそもPHP8の重要変更点のひとつに型の厳密化があります。Javaなどのように型一致を求めるようになってるので、その考え方からも使うべきではありません。

PHP公式ドキュメント

Function - substr

Function - empty

変更履歴

前の投稿
PHP8, 外部リソースを操る拡張機能のコアをリソース型変数からクラスオブジェクトへ移行
2021年9月。最新のPHPコーディング規約(PSR)。静的コードチェックはPSR-12。
次の投稿

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください