お急ぎの方は、お電話でも承っております。
お見積もり無料!携帯からでもOK!
株式会社MJE:TOKYO PRO MARKET上場(証券コード:433A)
株式会社MJE:TOKYO PRO MARKET上場(証券コード:433A)
ALL MENU 全メニュー
メーカーで選ぶ
お急ぎの方は、お電話でも承っております。
お見積もり無料!携帯からでもOK!
最短当日回答!
OA機器(コピー機)のプロにお任せください!
無料見積・相談する
arrow_forward
執筆者・監修情報株式会社MJE 「OA機器のお悩み解決コラム」編集部
当社は創業以来20年にわたり、複合機をはじめとするOA機器の提案を行ってきました。全国50,000社以上の取引実績と豊富な知見を活かして、皆さまのオフィスづくりに役立つ情報をお届けします。
>> 企業情報はこちら目次
こんにちは。IT解決コラム編集部です。
先日、当社では現在運用に携わっているサイトを「PHP8」にバージョンアップしました。これからバージョンアップを行うという方々も多い中、「PHP8にバージョンアップをしたらエラーまみれになった」のではないでしょうか?
実際にXで検索をしたところ、様々なユーザーがPHP8にバージョンアップしたことで、エラーコードに悩まされていることが分かりました。
Warning: Undefined variable **** in 略
— トラベラー@個人開発Webプログラマ (@traveler0905) October 24, 2023
Warning: Trying to access array offset on value of type null in 略
と、まぁ警告出たんですが、色々調べてたらPHP7.4以降ではスルーされんくなった単なるバグだってぇ
でさ、暫くソースコードとにらめっこしてたら、
「ん、ん-!?」
なんだ、タイポw
PHP8でWordPress(5.9)の検証してたら、$postをいきなり使うとUndefined variableのエラー表示が…。PHP8だと未定義の変数の使用は警告出るってこれのことかな。うーむ、過去作ったサイト大丈夫かなぁ。。🤔
— ねこポン@フリーWebデザイナー (@webdesigner_go) February 2, 2022
PHP8ではたくさんの新機能が追加され、よりコーディングしやすい言語に仕様変更されています。しかし、下位互換性のない変更点もあったため、移行時に不具合が発生しないよう対応が必要になります。バージョンを上げる前に必ずテストするようにしましょう。
今回はPHPのバージョンを7から8にアップデートした際の様々な不具合とその対処法を、備忘録としてまとめてご紹介します。
≫サポートも完備!ホームページ制作は「MJE DESIGN」
簡潔に言うと、PHP7では通知として許容されていたものが、バージョン8からは独立したエラーとして扱われるようになりました。
「書き方がより厳しくなった」というほうが伝わりやすいかもしれません。すべての通知がエラーになるわけではありませんが、エラーとして扱われるものが増えました。
その他にもかなりのボリュームの変更点があります。下位互換性のない変更点は、PHPの公式サイトにまとめられているため参考にしてみてください。
WordPressで制作したテストサイトでPHP8へのバージョンアップを試してみたところ、複数のエラーが確認できました。

今回の修正内容は下記の通りです。
「Warning: Undefined variable」は、指定している変数が定義されていない場合に発生するエラーです。
例えば、以下のコード例では変数$html、$category、$tagが事前に定義されてないため、PHP8.0以降のバージョンでは「Warning: Undefined variable」のエラーが発生してしまいます。
function hoge(){
global $post;
$html .= '<ul>';
// The Query
$args = array(
'post_type' => 'post',
'posts_per_page' => '3',
'post_status' => 'publish',
'category_name' =>$category,
'tag' =>$tag
);
このエラーを解消するためには、未定義の変数を初期化する必要があります。
function hoge()
{
global $post;
$html = '';
$html .= '<ul>';
// The Query
$args = array(
'post_type' => 'post',
'posts_per_page' => '3',
'post_status' => 'publish',
);
if (isset($category)) {
$args['category_name'] = $category;
}
if (isset($tag)) {
$args['tag'] = $tag;
}
このように修正すると、エラーが解消されました。
ちなみに、このような書き方をしても現在のPHP7のバージョンではエラーは起きませんでした。しかし、未定義の変数を使用すると予期しない動作やバグの原因となる可能性があるため、できるだけ初期化宣言をする慣習をつけていくことが推奨されています。
上記のエラー以外にも、もう1つ「Warning: Trying to access array offset on value of type null」というエラーが発生しています。そちらについても以下でご紹介します。

「Warning: Trying to access array offset」は、「null」や「bool型(true, false)」「数値型」の変数に配列として取得しようとした際に発生するエラーです。
このエラーには以下のようなバリエーションがあります。
例えば、以下のようなコードの場合にもエラーが発生していました。
function hoge()
{
global $post;
$tag = '';
if ($atts['tag']) {
$tag = $atts['tag'];
}
$html .= '<div class="swiper-wrapper">';
// The Query
$args = array(
'post_type' => 'post',
'posts_per_page' => '10',
'post_status' => 'publish',
'tag' => 'pickup',
);
こちらの改善点としては下記の通りです。
function hoge($atts = array()) // $atts を関数の引数として受け取る
{
global $post;
$tag = '';
$html = ''; // $html を初期化
if (isset($atts['tag'])) { // $atts['tag'] がセットされているか確認
$tag = $atts['tag'];
}
$html .= '<div class="swiper-wrapper">';
// The Query
$args = array(
'post_type' => 'post',
'posts_per_page' => '10',
'post_status' => 'publish',
'tag' => 'pickup',
);
// ... 以降のコード
}
これらの変数は、定義も初期化もされていませんでした。PHP7ではこれが許容されていましたが、新しいバージョンではより厳格なルールが適用されています。

1つ目の事例とは異なり、エラーコードすら表示されなかったため困惑しました。しかし、ソースコードを確認したところ、以下のようになっていました。

専門的な知識をお持ちの方ならすぐに気付くかもしれませんが、上記キャプチャの「116行目(最後の行)」を確認すると、PHP8にアップデートした後、ここでコードが途中で終了していることが確認できます。
これらの問題の原因とその解決方法については以下の通りです。
<h1><a href="<?php bloginfo(url); ?>"><img src="<?php bloginfo(url); ?>/wp-content/themes/mje/images/logo.png" alt="MJEロゴ" class="default-logo"><img src="<?php bloginfo(url); ?>/wp-content/themes/mje/images/scroll-logo.png" alt="MJEロゴ" class="scroll-logo"></a></h1>
<h1><a href="<?php echo esc_url(get_bloginfo('url')); ?>"><img src="<?php echo esc_url(get_bloginfo('url') . '/wp-content/themes/mje/images/logo.png'); ?>" alt="MJEロゴ" class="default-logo"><img src="<?php echo esc_url(get_bloginfo('url') . '/wp-content/themes/mje/images/scroll-logo.png'); ?>" alt="MJEロゴ" class="scroll-logo"></a></h1>
原因を詳しく探るために、さらに深く分析していきます。
bloginfo(‘url’) は、サイトのホームURLを表示するための関数で、この関数は直接URLを出力します。
しかし、PHP8ではURLを取得する場合、get_bloginfo(‘url’) を使用することが推奨され、この部分の取り扱いがさらに厳格になったことが伺えます。
これらの修正を行ったにも関わらず、サイトはまだ正常に動作しなかったため、原因をさらに調査しました。
ページネーションの「前のページへ戻る」「次のページへ進む」の書き方にも変更がありました。
<a href="<?php echo $prev_post->guid ?>" class="page-nation__icon"><i class="fas fa-arrow-left"></i></a>
<a href="<?php echo $next_post->guid ?>" class="page-nation__icon"><i class="fas fa-arrow-right"></i></a>
<a href="<?php echo get_permalink($prev_post->ID); ?>" class="page-nation__icon"><i class="fas fa-arrow-left"></i></a>
<a href="<?php echo get_permalink($next_post->ID); ?>" class="page-nation__icon"><i class="fas fa-arrow-right"></i></a>
$prev_post->guid と $next_post->guid の使用が原因であり、WordPressのguidは、一般的には公開URLとして使用するべきではありません。
代わりに、get_permalink() 関数を使用して、正確なURLを取得することをおすすめします。
以上の修正を行った結果、サイトは正常に動作するようになりました。

「いつかPHP8にバージョンアップしなければ」と考えていて、まだ実行されていない企業のご担当者も多いのではないでしょうか?
こちらはエックスサーバーの管理画面になりますが、管理画面上では、2023年の夏まではPHPのバージョン「7.4.33」が推奨されていました。しかしながら2023年の夏から秋にかけて非推奨となりました。本記事を書いているのは2024年になりますが、今後は8.x.xxや9シリーズが主流になっていくことが確実です。
他のソフトウェアと同様、PHPにもリリースライフサイクルがあり、これを遵守することで、さらなる進化と改善を繰り返すことができています。
PHPの各メジャーリリースは、通常、リリース後の2年間サポートされます。この間、バグやセキュリティの問題が定期的に修正され、パッチが適用されます。
このような大規模なバージョンアップは数年単位で発生するため避けては通れませんが、想像以上に大変な作業でした。今回の作業の中で発生したエラーへの対処は学びになりました。

PHP7以前のバージョンを使用している場合は、新しい機能追加やパフォーマンス向上といったバージョンアップによる恩恵を受けられないだけでなく、セキュリティ面でも問題があります。
そういった意味でも、最新のバージョンを維持することが大切です。
また、「PHP」のバージョンが古いために以下のような問題が起こる可能性もあります。
バージョンが上がるごとにセキュリティの向上やスピードアップなどの恩恵が増えるため、PHP8へのアップデートはおすすめです。

最後になりますが、当社では今回ご紹介したようなPHPで動的なWebサイト制作(WordPressメイン)を行っております。
貴社が伝えたい内容をわかりやすく伝えられるよう、経験豊富なクリエイターがヒアリングからデザイン・制作、そして保守・メンテナンスまで一貫した制作体制でサポートいたします。
≫ 株式会社MJEのWebデザインのテンプレート一覧はこちら
※制作イメージをご確認いただけます。
「新しくホームページを作りたい」や「リニューアルしたい」「WordPressで簡単に更新をしたい」とお考えの方は、ぜひ一度以下のお問い合わせフォームからご相談ください!
エラー: コンタクトフォームが見つかりません。
理由
1
メーカー直だから
コスパ抜群
理由
2
月々の保守料金まで
しっかり抑えられる
理由
3
安心の
メーカー+自社メンテ
理由
4
おかげさまで
取引実績5万社以上
理由
5
新規開業や個人事業主の
実績も豊富
理由
6
場所も納期も
柔軟に対応可能
※ 業界最安価格は京セラ製複合機が対象です。他メーカーの複合機も特別価格でご提案いたします。
※ 当社は、京セラ複合機の国内販売台数No.1の実績を持つ一次代理店です。
※ 一部の離島などは対応できない場合がございます。また、納期「2日」は確約ではございません。詳しくはお問い合わせください。
お急ぎの方は、お電話でも承っております。
お見積もり無料!携帯からでもOK!
最短当日回答!
OA機器(コピー機)のプロにお任せください!
無料見積・相談する
arrow_forward