主な修正点は:

・each が削除されたので、下のように current(), next() を使う形に書き換えた。

(参考:「PHP8 で Call to undefined function each() になる場合の対処法」)

(変更前)
    while (list($k, $v) = each($a)) {
         なんちゃら;
     }

(変更後)
     while ($c = current($a)) {
        $k = key($a);
        $v = $c;
         next($a);
         なんちゃら;
     }

・要素へのオフセットを使ったアクセス演算子「{}」が削除されたので、「[]」に置き換えた。

・MB_OVERLOAD_STRING, MB_OVERLOAD_REGEX が削除されたので、これを使って mbstring へのオーバーロードが可能かチェックするコードをコメントアウト。

→本当は、チェックをコメントアウトするだけではだめで、コード中で mbstring へのオーバーロードを前提にした関数の呼び出しをしている箇所を全て、明示的に mbstring 用の関数に置き換える作業が必要だが、あまりにも大変なのでまだやっていない。

ついでに、古いバージョンでサーバー内のソースコードを上書きしてしまい、きちんと動作しなくなった箇所が何カ所か出たので、エラー表示を元にコードの追加変更を思い出しながら復旧させた。

ちなみに、今回、 php8 で動作させてみたところ、まったく何もエラー内容が表示されず、「HTTP 500」とだけ表示されたため、エラーの内容を確認するために、 php.ini に、「display_errors = On」を追加して作業を行った。



今回の修正は、 pear xmlrpc パッケージにも行った。

XML/RPC.php と、XML/RPC/Server.php

の2つのファイルで、 each を使用している部分に対し修正を行っている。

・・・で、 php8 に対応できたと思っていたが、 pear xmlrpc パッケージへの修正で問題が見つかった。 xml_parser_create() で、 php7 まではリソースハンドルが返されており、それを前提とした設計がされているのだが、 php8 からはオブジェクトのインスタンスが返されるように変更されたため、このままでは正しく動作できない。当面 php7 での運用を続けながら、 pear xmlrpc の部分をどうするかを検討することにした。というわけで、 rNote-re の php8 への対応は、xml-rpc を除いた部分まで完了というのが現状だ。

[2022-04-22]

pear の XML-RPC パッケージを使用するのをやめて、 phpxmlrpc を使用するように修正してみたところ、どうやら php8 で XML-RPC が使用できるようになったようだ。ただし、 phpxmlrpc のソースをざっと眺めてみた感じ each が使用されている箇所があるようなので、場合によって phpxmlrpc に手を入れる必要が出てくるかも知れない。

キーワード: rNote-re php8