Web Programmerメモ

プログラム開発のメモです

PHP 7.4:Trying to access array offset on value of type bool

概要

PHP 7.4にバージョンアップすると、
Trying to access array offset on value of type bool のExceptionが発生するようになった。

問題のコード

mb_regex_encoding("UTF-8");
mb_ereg_search_init($text, "[가-힣]+");
if (mb_ereg_search()) {
    $hangul = mb_ereg_search_getregs(); //get first result
    $text = str_replace($hangul[0], $hc->conv2kana($hangul[0], true), $text);
    do {
        $hangul = mb_ereg_search_regs();//get next result
        $text = str_replace($hangul[0], $hc->conv2kana($hangul[0], true), $text);  //←ここでエラーが発生
    } while($hangul);
}

これは何をやっているかというと、
$text からハングルの文字列を順に抜き出して、自前モジュールでカタカナに変換している。

do - whileの中で mb_ereg_search_regs関数で順に抜き出していって、
抜き出せるものがなくなったらループから抜ける。

このコードはphp 7.3までは特に問題なく動いていた。

何が問題か

エラーメッセージのとおり、
bool型の変数に対して配列インデックスでアクセスしているのが問題っぽい。

mb_ereg_search_regs() 関数は抜き出せるものがない場合、FALSEを返す仕様である。 https://www.php.net/manual/ja/function.mb-ereg-search-regs.php

do-whileの中でmb_ereg_search_regs() は最後はFALSEを返すので、
$hangul = FALSE; が代入され、

それに対して $hangul[0] のように配列アクセスをしているので今回のエラーが発生したようだ。

対処

とりあえずやっつけで回避。

mb_regex_encoding("UTF-8");
mb_ereg_search_init($text, "[가-힣]+");
if (mb_ereg_search()) {
    $hangul = mb_ereg_search_getregs(); //get first result
    $text = str_replace($hangul[0], $hc->conv2kana($hangul[0], true), $text);
    do {
        $hangul = mb_ereg_search_regs();//get next result
        if ($hangul !== false) {
            $text = str_replace($hangul[0], $hc->conv2kana($hangul[0], true), $text);
        }
    } while($hangul);
}

本当はそもそもdo-while構文を使わずに書き直した方がよいのでは、と思っているが。