PHPのバージョンを上げるとき、古いサイトで実際に直した3箇所

こんにちは。ワクワクラボのはぜやまです。
サーバー会社から「PHPのバージョンを上げてください」という案内が届いたまま、手をつけずにいる方は少なくないのではないでしょうか。この記事では、PHP 7 から 8 への移行を担当した案件で、実際に修正が必要になった3箇所を書きます。何が起きるのかが分かれば、いつ手をつけるかの判断もしやすくなりますね。
そもそもPHPとは、WordPressが動くための裏方になっている言語です

まず、言葉の整理からいきましょう。
PHP(ピー・エイチ・ピー)とは、WordPress本体やテーマ、プラグインを書くために使われているプログラミング言語です。サイトの見た目がHTMLで作られているとすれば、その裏側で記事を取り出したり、フォームの送信を受け取ったりしているのがPHPですね。
この裏方の言語にもバージョンがあり、サーバー側で切り替えられるようになっています。そしてバージョンが上がるたびに、書き方のルールは少しずつ厳しくなっていきます。今回の話は、その厳しくなった部分に古い書き方が引っかかる、という内容なのです。
PHP 7 から 8 へ上げた案件で、直す必要があったのは3箇所でした

それでは、実際の案件の話に入ります。
私たちが担当したのは、PHP 7 で動いていたサイトを 8 へ移行する作業でした。事前に確認したところ、修正が必要だと分かった箇所は3つです。
数としては、思ったより少ないと感じられたかもしれません。ただ、この3箇所は「直さなくてもよい箇所」ではないのですね。PHP 7 では警告で済んでいた書き方が、8 ではエラーとして扱われます。警告なら処理は先へ進みますが、エラーになると、その場で処理が止まってしまいます。
1つ目は、変数が存在しない場合の処理を足すことでした
1箇所目は、変数が存在しない場合のエラー処理の追加です。
変数というのは、値を入れておく箱のようなものですね。プログラムは、その箱の中身を取り出して使います。ところが実際のコードには、箱そのものが用意されていない場面が出てくるのです。
PHP 7 は、そうした場面でも警告を出しながら処理を続けてくれていました。8 ではここがエラーになるため、箱がなかったときにどう振る舞うかを、あらかじめ書き足す必要がありました。
2つ目は、配列のキーが存在しない場合の処理でした
2箇所目は、配列のキーが存在しない場合の処理の追加です。
配列(はいれつ)とは、複数の値をまとめて入れておく、引き出しのついた棚のようなものです。キーは、その引き出しに貼られた名札にあたりますね。
名札のない引き出しを開けにいったとき、PHP 7 は警告を出して先へ進みました。8 ではここもエラーになります。1つ目と構造はまったく同じで、「無いものを取りにいったときにどうするか」が書かれていなかった箇所です。
3つ目は、絶対パスで書かれていた箇所を、関数で組み立てる形に変えました
3箇所目だけは、少し性質が違います。
絶対パスとは、サーバーの中の置き場所を、いちばん上の階層から書ききった住所のことです。住所を直接書き込んでいるので、サーバーの構成が変われば、その記述はそのまま通用しなくなります。
そこで、住所を直接書くのをやめて、そのつど関数で組み立てる形に変更しました。関数というのは、決まった手順をひとまとめにした部品のことですね。今いる場所をもとに住所を計算してくれるので、置かれた環境が変わっても指す先がずれません。
3箇所に共通していたのは、PHP 7 では警告で済んでいた書き方です

ここまでの3箇所を並べると、共通点が見えてきます。
いずれも、PHP 7 の時点ですでに望ましくない書き方として警告が出ていた箇所でした。警告は画面に現れるわけではありませんから、サイトが動いている限り、誰も気づかないのですね。
つまり、バージョンを上げたことで問題が生まれたわけではありません。前から積もっていたものが、上げたタイミングでまとめて表に出た、という順番です。
古いサイトほど、該当する箇所は多くなります
今回の案件は3箇所で済みましたが、これはサイトによって変わります。
書き方のルールは、バージョンが上がるたびに厳しくなってきました。ということは、古い時期に作られたサイトほど、当時は問題にならなかった書き方が多く残っていることになりますね。
ですから「3箇所くらいなら何とかなりそうだ」と考えるのは、まだ早いかもしれません。自分のサイトに何箇所あるかは、実際に確かめてみるまで分からないのです。作り直しを検討する段階にあるかどうかの目安は、ホームページをリニューアルすべきタイミング。年数ではなく状態で判断するに書きました。
上げる前に、検証環境で確認します
では、どう進めればよいのでしょうか。
はっきりしているのは、本番のサイトでいきなりバージョンを上げない、ということです。同じ構成のサイトを別に用意し、そちらでバージョンを切り替えて、どこが動かなくなるかを先に洗い出します。この、本番と切り離した確認用のサイトを検証環境と呼びます。
本番でそのまま上げてしまうと、動かない箇所が見つかった時点で、サイトはもう止まっているのですね。原因を探して直しているあいだ、訪問してくださった方は、その画面を見ることになります。
対応するかどうかは、いつかは決めることになります

案内が届いても、今すぐ何かが壊れるわけではありません。
ただ、PHPのバージョンには、公式にサポートされる期間が定められています(出典: PHP公式 Supported Versions)。ですから、上げるか上げないかは、いつかは判断する場面が来る性質のものなのです。
私たちが実際に扱ってみて感じたのは、慌てて動くほど選べる道が減る、ということでした。止まってから原因を探すより、検証環境で3箇所なのか30箇所なのかを先に知っておくほうが、落ち着いて決められます。この種の作業をどこまで自分で持つかという判断は、ホームページの保守管理。外注する?自力で対応?メリットデメリットを解説。で扱っています。
外部に頼む場合、検証環境を用意するかどうかを先に聞いてみると、進め方の考え方が見えると思います。依頼先を見るときの観点は、ホームページ制作会社の選び方。名古屋で依頼する前に確認する判断基準にまとめました。
よくある質問
PHPのバージョンを上げないままでも、サイトは動きますか?
上げなかったことで、今動いているサイトがその日のうちに止まるわけではありません。ただし、PHPのバージョンには公式にサポートされる期間が定められているため、いつかは判断する場面が来ます。
修正が3箇所なら、自分たちでも直せますか?
箇所の数はサイトによって変わります。私たちが担当した案件では3箇所でしたが、古いサイトほど該当する箇所は多くなります。何箇所あるかは、検証環境で確認してみるまで分かりません。
検証環境は、必ず用意したほうがよいですか?
本番でいきなり上げると、動かない箇所が見つかった時点でサイトが止まった状態になります。私たちは、本番と同じ構成の検証環境で先に確認する形をとっています。
この記事の要点
- PHPは、WordPress本体やテーマ、プラグインが書かれているプログラミング言語で、バージョンはサーバー側で切り替える
- PHP 7 から 8 へ移行した案件で、実際に修正が必要だったのは3箇所だった
- 内訳は、変数が存在しない場合のエラー処理の追加、配列のキーが存在しない場合の処理の追加、絶対パスで書かれていた箇所を関数で生成する形へ変更、の3つ
- いずれも PHP 7 では警告で済んでいた書き方で、8 ではエラーになる
- 古いサイトほど該当箇所は多くなるため、箇所数は事前に確かめないと分からない
- バージョンを上げる前に、本番と切り離した検証環境で確認する
ワクワクラボでは、WordPressサイトのPHPバージョン移行と、その前段の検証をお受けしています。「サーバー会社から案内は来ているが、何を確認すればよいか分からない」という段階でも大丈夫です。


