KCFinderのPHP8.1への対応について

KCFinder(v3.12)をPHP8.1で動作させると、「原因不明のエラーです。」と表示され、画像一覧のサムネイルが表示されませんでした。

PHP8.1 KCFinderエラー

原因

エラーの詳細がブラウザ上で表示されないのため非常に分かりにくくなっております。

ひとまずApacheのerror_logにて以下のエラーメッセージを確認しました。

PHP Deprecated: strlen():
Passing null to parameter #1 ($string) of type string is deprecated in
/home/xxxxxx/yyy/zzzzz/kcfinder/lib/class_fastImage.php on line 211

strlen()関数の引数にnullが入ってしまうことでDepricatedエラーが発生しているようです。

結論

とりあえず結論から。

"kcfinder/lib/class_fastImage.php"の19行目、fastImageクラスのメンバー変数$strの定義を確認します。

private $str;

メンバー変数$strを空の文字列で初期化するように変更します。

private $str = ''; 

これでエラーは出なくなり、正常に動くようになりました。

PHP8.1 KCFinder 正常動作

解説

結論の内容に至った経緯を解説します。

エラーメッセージより、"kcfinder/lib/class_fastImage.php"の該当箇所(202~231行目 getChars()関数)を確認。

エラーは2箇所、207行目と211行目にあります。

private function getChars($n)
{
  $response = null;

  // do we need more data?
  if ($this->strpos + $n -1 >= strlen($this->str)) // ※207行目エラー
  {
    $end = ($this->strpos + $n);

    while (strlen($this->str) < $end && $response !== false) // ※211行目エラー
    {
      // read more from the file handle
      $need = $end - ftell($this->handle);
      if ($response = fread($this->handle, $need))
      {
        $this->str .= $response;
      }
      else
      {
        return false;
      }
    }
  }

  $result = substr($this->str, $this->strpos, $n);
  $this->strpos += $n;

  return $result;
}

いずれもstrlen()の引数が$this->strになっています。

つまり、$this->strにnullが入ってしまっていることになります。

$this->strはfastImageクラスのメンバー変数です。

このメンバー変数が定義されている部分(18~22行目)を確認します。

private $strpos = 0;
private $str;   // ※この変数が初期化されていない
private $uri;
private $type;
private $handle;

メンバー変数$strが初期化されていません。

このままだとメンバー変数$strにはnullが入るようです。

これを空の文字列で初期化することで、strlen()関数の引数にnullが入ることを防ぐことができます。

private $str = '';

ここではstrlen()関数におけるDeprecatedエラーに注目して変更したところうまくいきましたが、もしかすると別の理由で正常に動作しなかったのかもしれません。

感想

昔のPHPは緩いところがあってそれとなく動いていたと思うのですが、やはり変数の初期化って大切ですね。(´・ω・)

参考サイト

スポンサードリンク