PHP 7とPHP 8の大きな違いは、処理性能・文法・型チェック・エラー処理・セキュリティ面にあります。
PHP 8は、PHP 7よりも新しいメジャーバージョンです。
名前付き引数、match式、Nullsafe演算子、Union Types、Attributesなど、より分かりやすく安全にコードを書ける機能が追加されています。
一方で、PHP 8では古い関数や古い書き方が削除・非推奨になっているため、PHP 7で動いていたサイトやシステムがPHP 8でそのまま動くとは限りません。
特に、古いWordPressテーマ、更新されていないプラグイン、独自CMS、長年メンテナンスされていないPHPコードでは注意が必要です。
PHP 7とPHP 8の基本的な違い
PHP 8はPHP 7より新しいメジャーバージョン
PHP 8は、PHP 7系の次に登場したメジャーバージョンです。
メジャーバージョンが変わるということは、新しい機能が追加されるだけでなく、古い仕様の削除や互換性に関わる変更も含まれるということです。
そのため、PHP 7からPHP 8へ移行する場合は、単にサーバーのPHPバージョンを切り替えるだけではなく、使用しているCMS、テーマ、プラグイン、フレームワーク、独自コードがPHP 8に対応しているか確認する必要があります。
PHP 7系は公式サポートが終了している
PHP 7系は、すでに公式サポートが終了しています。
公式サポートが終了したPHPを使い続けると、セキュリティ修正が提供されなくなるため、脆弱性が見つかった場合にリスクが高くなります。
そのため、現在PHP 7系を使っているWebサイトやシステムは、できるだけPHP 8系への移行を検討するべきです。
ただし、PHP 8系の中でもバージョンによってサポート状況や対応状況は異なります。
実務では、利用しているCMSやフレームワーク、サーバー環境が対応しているPHP 8系の安定版を選ぶことが重要です。
PHP 8で追加された主な新機能
名前付き引数が使えるようになった
PHP 8では、関数を呼び出すときに引数名を指定できる名前付き引数が使えるようになりました。
PHP 7では、関数の引数は基本的に順番どおりに指定する必要がありました。
function createUser(string $name, string $email, bool $active = true): void
{
// ユーザー作成処理
}
createUser('山田太郎', 'taro@example.com', true);
PHP 8では、次のように引数名を指定して呼び出せます。
function createUser(string $name, string $email, bool $active = true): void
{
// ユーザー作成処理
}
createUser(
name: '山田太郎',
email: 'taro@example.com',
active: true
);
名前付き引数を使うと、どの値が何を意味しているのか分かりやすくなります。
特に、引数が多い関数や、真偽値を複数渡す関数では、コードの可読性が上がります。
ただし、外部ライブラリやフレームワークの関数に名前付き引数を使う場合は注意が必要です。
将来的にライブラリ側で引数名が変更されると、コードが動かなくなる可能性があります。
match式が使えるようになった
PHP 8では、switchに似た新しい構文としてmatch式が追加されました。
PHP 7では、条件によって値を変える場合にswitchを使うことがありました。
$status = 'paid';
switch ($status) {
case 'paid':
$message = '支払い済み';
break;
case 'pending':
$message = '保留中';
break;
default:
$message = '不明';
}
PHP 8では、matchを使って次のように書けます。
$status = 'paid';
$message = match ($status) {
'paid' => '支払い済み',
'pending' => '保留中',
default => '不明',
};
matchは値を返す式として使えるため、変数への代入と相性が良いです。
また、switchよりも比較が厳密で、1と"1"のような値を同じものとして扱いにくくなります。
そのため、意図しない条件分岐を減らしやすいというメリットがあります。
Nullsafe演算子が使えるようになった
PHP 8では、?->というNullsafe演算子が追加されました。
PHP 7では、オブジェクトがnullの可能性がある場合、事前にチェックを書く必要がありました。
if ($user !== null) {
$profile = $user->getProfile();
if ($profile !== null) {
$name = $profile->getName();
}
}
PHP 8では、Nullsafe演算子を使って次のように書けます。
$name = $user?->getProfile()?->getName();
途中の値がnullだった場合、その時点で処理が止まり、全体の結果がnullになります。
会員情報、プロフィール情報、注文情報など、データが存在しない可能性がある処理では便利です。
ただし、Nullsafe演算子は主に値を取得する場面で使うもので、値の代入には使えません。
更新処理では、通常のnullチェックが必要になる場合があります。
Union Typesが使えるようになった
PHP 8では、複数の型を許可できるUnion Typesが追加されました。
PHP 7では、「整数または小数を受け取る」といった型指定を明確に書きにくい場面がありました。
PHP 8では、次のように書けます。
function formatPrice(int|float $price): string
{
return number_format($price) . '円';
}
int|floatと指定することで、この関数は整数または小数を受け取ることが明確になります。
Union Typesを使うことで、関数やメソッドの仕様が分かりやすくなり、想定外の値によるバグを減らしやすくなります。
mixed型が使えるようになった
PHP 8では、mixed型も使えるようになりました。
function logData(mixed $data): void
{
var_dump($data);
}
mixedは、さまざまな型の値を受け取る可能性があることを明示するための型です。
型を指定していないのではなく、「複数の型を受け取る可能性がある」と明確に示せる点がメリットです。
ただし、何でもmixedにしてしまうと型指定の意味が薄れてしまいます。
基本的には、string、int、array、boolなど、できるだけ具体的な型を指定し、どうしても複数の型を扱う必要がある場合に使うのが望ましいです。
Attributesが使えるようになった
PHP 8では、Attributesが追加されました。
Attributesは、クラスやメソッドなどにメタ情報を付けるための仕組みです。
#[Route('/contact')]
class ContactController
{
}
PHP 7以前では、コメント内にアノテーションとして情報を書くことが一般的でした。
/**
* @Route("/contact")
*/
class ContactController
{
}
PHP 8のAttributesは、コメントではなくPHPの正式な構文として扱われます。
そのため、フレームワークやライブラリ側でメタ情報を安全に読み取りやすくなります。
SymfonyやLaravel関連の機能、独自フレームワークの設計などで活用されることがあります。
コンストラクタプロパティ昇格が使えるようになった
PHP 8では、クラスのプロパティ定義とコンストラクタでの代入をまとめて書けるコンストラクタプロパティ昇格が追加されました。
PHP 7では、次のようにプロパティ定義と代入処理を別々に書く必要がありました。
class User
{
private string $name;
private string $email;
public function __construct(string $name, string $email)
{
$this->name = $name;
$this->email = $email;
}
}
PHP 8では、次のように短く書けます。
class User
{
public function __construct(
private string $name,
private string $email
) {}
}
同じ意味のコードを少ない記述量で書けるため、DTO、Entity、Value Objectなどを作るときに便利です。
str_containsなど便利な標準関数が追加された
PHP 8では、文字列処理で便利な標準関数も追加されました。
代表的な関数は以下です。
str_contains()
str_starts_with()
str_ends_with()
PHP 7では、文字列に特定の文字が含まれているか調べる場合、strpos()を使うことが一般的でした。
if (strpos($text, 'PHP') !== false) {
echo '含まれています';
}
PHP 8では、str_contains()を使って次のように書けます。
if (str_contains($text, 'PHP')) {
echo '含まれています';
}
strpos()は戻り値が0になる場合があるため、!== falseを書き忘れるとバグの原因になります。
一方、str_contains()は「含まれているかどうか」をそのまま判定できるため、コードの意味が分かりやすくなります。
PHP 8では型チェックやエラー処理が厳しくなった
PHP 8では曖昧な処理がエラーになりやすい
PHP 8では、PHP 7に比べて型チェックやエラー処理が厳しくなっています。
PHP 7では警告で済んでいた処理が、PHP 8ではTypeErrorやValueErrorとして扱われることがあります。
これは、古いコードが動きにくくなるという面もありますが、開発上はバグを早く見つけやすくなるというメリットがあります。
ただし、本番環境でいきなりPHP 8に切り替えると、これまで表面化していなかったエラーが表示されたり、処理が止まったりする可能性があります。
そのため、PHP 7からPHP 8へ移行する際は、必ずテスト環境で確認することが重要です。
非厳密比較の挙動が変わった
PHP 8への移行で特に注意したいのが、数値と文字列の比較です。
PHP 7では、次のような比較がtrueになることがありました。
var_dump(0 == "foo");
PHP 7では、数値と文字列の非厳密比較により、意図しない判定になる場合がありました。
PHP 8では、このような比較の挙動が変更され、より自然な結果になります。
これはPHP 8の改善点ですが、古いコードで==や!=を多用している場合、PHP 7とPHP 8で条件分岐の結果が変わる可能性があります。
そのため、PHP 8へ移行する際は、できるだけ===や!==を使った厳密比較へ見直すことが重要です。
// あいまいな比較
if ($value == 0) {
// 処理
}
// 厳密な比較
if ($value === 0) {
// 処理
}
ただし、フォーム入力などでは値が文字列として渡されることも多いため、単純にすべて置き換えればよいわけではありません。
仕様を確認しながら修正する必要があります。
PHP 8で削除・非推奨になった古い機能
create_functionは削除された
PHP 8では、古い関数の一部が削除されています。
代表的なものの一つがcreate_function()です。
古いPHPコードでは、次のような書き方が使われていることがあります。
$func = create_function('$a', 'return $a * 2;');
PHP 8ではcreate_function()は使えません。
代わりに、無名関数を使います。
$func = function ($a) {
return $a * 2;
};
古いWordPressテーマや古い独自システムでは、create_function()が残っていることがあります。PHP 8移行時には確認が必要です。
eachは削除された
PHP 8では、each()も削除されています。
古いコードでは、配列を処理するために次のような書き方が使われていることがあります。
while (list($key, $value) = each($array)) {
echo $key . ':' . $value;
}
PHP 8では、通常はforeachを使います。
foreach ($array as $key => $value) {
echo $key . ':' . $value;
}
each()を使ったコードが残っている場合、PHP 8ではエラーになるため修正が必要です。
__autoloadは削除された
PHP 8では、古い自動読み込みの仕組みである__autoload()も削除されています。
現在は、spl_autoload_register()を使う方法が一般的です。
古いライブラリや独自CMSでは、__autoload()が残っている場合があります。
PHP 8へ移行する前に確認しておくべきポイントです。
PHP 7からPHP 8への移行でよくあるエラー
Undefined array key
PHP 8では、存在しない配列キーにアクセスしたときの警告が目立ちやすくなっています。
例えば、次のようなコードです。
echo $_GET['id'];
URLにidパラメータがない場合、警告が出る可能性があります。
安全に書くなら、次のようにします。
$id = $_GET['id'] ?? null;
必須の値であれば、事前にチェックします。
if (!isset($_GET['id'])) {
exit('IDが指定されていません');
}
Attempt to read property on null
PHP 8では、nullの値に対してプロパティを読もうとするとエラーになることがあります。
echo $user->name;
$userがnullの可能性がある場合は、事前に確認する必要があります。
PHP 8では、Nullsafe演算子を使って次のように書くこともできます。
echo $user?->name;
ただし、nullだった場合にどう処理するのかは、システムの仕様に合わせて決める必要があります。
TypeErrorやValueError
PHP 8では、関数に不正な型や不正な値を渡した場合、TypeErrorやValueErrorが発生することがあります。
PHP 7では警告やfalseの返却で済んでいた処理が、PHP 8では例外として扱われることがあります。
そのため、PHP 8へ移行する際は、エラーログを確認し、想定外の値が関数に渡されていないかチェックすることが重要です。
PHP 8の処理速度とパフォーマンス
PHP 8ではパフォーマンス面で有利になるケースがある
PHP 8では、内部処理の改善やJITの導入により、PHP 7よりパフォーマンス面で有利になるケースがあります。
ただし、どのWebサイトでも必ず大幅に高速化するわけではありません。
Webサイトの表示速度は、PHPのバージョンだけでなく、以下の要素にも大きく影響されます。
- サーバー性能
- OPcacheの設定
- データベース処理
- WordPressテーマ
- プラグイン
- キャッシュ設定
- 画像の重さ
- JavaScriptやCSS
- 外部タグや広告タグ
そのため、「PHP 8にすれば必ず表示速度が大きく改善する」と考えるのは注意が必要です。
JITは一般的なWebサイトでは効果が限定的な場合もある
PHP 8では、JITコンパイラが導入されました。
JITは、処理の一部を実行時に機械語に近い形へ変換し、処理を高速化する仕組みです。
ただし、JITの効果は処理内容によって異なります。
数値計算やCPU負荷の高い処理では効果が出やすい一方で、一般的なWebサイトやWordPressサイトでは、JITだけで大幅に速くなるとは限りません。
実務では、PHP 8への移行だけでなく、キャッシュ設定、データベース最適化、画像最適化、不要なプラグインの削除などもあわせて行うことが重要です。
WordPressでPHP 7からPHP 8へ移行する際の注意点
WordPress本体の対応状況を確認する
WordPressサイトでPHP 8系へ移行する場合、まずWordPress本体が移行先のPHPバージョンに対応しているか確認する必要があります。
WordPress本体が古いままだと、PHP 8で警告やエラーが出る可能性があります。
PHPを切り替える前に、WordPress本体を更新できる状態か確認しておきましょう。
テーマの対応状況を確認する
WordPressでは、テーマ側のPHPコードが原因でエラーになることがあります。
特に、何年も更新されていないテーマや、独自カスタマイズが多いテーマでは注意が必要です。
functions.phpに古いコードが残っている場合、PHP 8でエラーが発生することがあります。
プラグインの対応状況を確認する
PHP 8移行時にトラブルになりやすいのが、古いプラグインです。
特に、以下のようなプラグインは注意が必要です。
- 長期間更新されていないプラグイン
- 配布終了したプラグイン
- 古い有料プラグイン
- 独自開発されたプラグイン
- EC機能や予約機能など重要な処理を担うプラグイン
PHP 8へ切り替える前に、使用中のプラグインが移行先のPHPバージョンに対応しているか確認しましょう。
いきなり本番環境で切り替えない
WordPressサイトでは、いきなり本番環境でPHP 8へ切り替えるのは避けるべきです。
まずはステージング環境やテスト環境でPHP 8に切り替え、表示崩れやエラーがないか確認します。
特に、以下のページや機能は重点的に確認しましょう。
- トップページ
- 投稿ページ
- 固定ページ
- お問い合わせフォーム
- 予約フォーム
- EC機能
- 会員登録
- ログイン機能
- 管理画面
- 検索機能
- カスタム投稿タイプ
- カスタムフィールド
画面上は問題がなくても、エラーログに警告が出ている場合があります。
必ずログも確認することが大切です。
PHP 7とPHP 8の比較表
主な違いの一覧
| 項目 | PHP 7 | PHP 8 |
|---|---|---|
| サポート状況 | 公式サポート終了 | PHP 8系のサポート対象バージョンを利用可能 |
| 処理性能 | PHP 5系より大幅に改善 | 内部処理の改善やJITにより有利なケースがある |
| JIT | なし | あり |
| 名前付き引数 | なし | あり |
| match式 | なし | あり |
| Nullsafe演算子 | なし | あり |
| Union Types | なし | あり |
| mixed型 | なし | あり |
| Attributes | なし | あり |
| コンストラクタプロパティ昇格 | なし | あり |
| 文字列処理関数 | strpos()などを使うことが多い | str_contains()などが使える |
| 型チェック | 比較的ゆるい | より厳密 |
| エラー処理 | 警告で済むケースもある | TypeErrorやValueErrorになるケースがある |
| 古い関数 | 一部利用可能 | 削除済みのものがある |
| 非厳密比較 | 古い挙動が残る | より自然な挙動に変更 |
| 移行時の注意 | PHP 7内での互換性確認が中心 | PHP 7からの互換性確認が必要 |
PHP 7からPHP 8へ移行するメリット
セキュリティ面で安心しやすい
PHP 7系は公式サポートが終了しているため、セキュリティ面でリスクがあります。
PHP 8系のサポート対象バージョンを使うことで、セキュリティ修正を受けられる環境にしやすくなります。
Webサイトやシステムを長期的に運用するなら、サポート対象のPHPを使うことは非常に重要です。
コードの可読性が上がる
PHP 8では、名前付き引数、match式、Nullsafe演算子、コンストラクタプロパティ昇格などにより、コードをより短く分かりやすく書けます。
コードの記述量が減ると、保守もしやすくなります。
特に複数人で開発するシステムや、長期間運用するWebサービスでは、可読性の高さは大きなメリットになります。
バグを見つけやすくなる
PHP 8では、型チェックやエラー処理が厳しくなっています。
そのため、PHP 7では見過ごされていた不具合が、PHP 8ではエラーとして明確になることがあります。
一見すると移行時の手間は増えますが、長期的にはバグを見つけやすくなり、品質向上につながります。
最新のCMSやフレームワークを使いやすくなる
最近のWordPress、Laravel、SymfonyなどのCMSやフレームワークは、PHP 8系を前提にしていることが増えています。
PHP 7のままだと、新しいバージョンのフレームワークやプラグインを使えない場合があります。
今後の保守性や拡張性を考えると、PHP 8系への移行は重要です。
PHP 7からPHP 8へ移行するデメリット・リスク
古いコードが動かない可能性がある
PHP 8では、古い関数や古い書き方の一部が削除されています。
そのため、PHP 7で動いていたコードがPHP 8ではエラーになることがあります。
特に、長年メンテナンスされていない独自システムでは、修正箇所が多くなる可能性があります。
プラグインやテーマが対応していない場合がある
WordPressの場合、PHP本体がPHP 8に対応していても、テーマやプラグインが対応していなければ不具合が発生します。
お問い合わせフォーム、予約機能、EC機能、会員機能など、サイト運営に重要な機能がある場合は慎重に確認する必要があります。
移行前の検証が必要になる
PHP 8へ移行するには、事前の検証が必要です。
テスト環境の用意、エラーログの確認、プラグインの更新、コード修正などが必要になる場合があります。
古いサイトほど、移行に時間や費用がかかる可能性があります。
PHP 7からPHP 8へ移行する手順
現在のPHPバージョンを確認する
まず、現在使っているPHPのバージョンを確認します。
コマンドラインを使える場合は、以下で確認できます。
php -v
PHPファイルで確認する場合は、以下のようにします。
<?php
phpinfo();
WordPressの場合は、管理画面の「サイトヘルス」からPHPバージョンを確認できます。
バックアップを取る
PHPのバージョンを変更する前に、必ずバックアップを取ります。
バックアップすべきものは以下です。
- Webサイトのファイル
- データベース
- WordPressテーマ
- プラグイン
- アップロード画像
- 設定ファイル
万が一エラーが発生しても、元に戻せる状態にしておくことが重要です。
テスト環境でPHP 8に切り替える
本番環境ではなく、まずテスト環境でPHP 8に切り替えます。
テスト環境で以下を確認します。
- 画面が正常に表示されるか
- 管理画面にログインできるか
- フォームが送信できるか
- ECや予約機能が動くか
- エラーログが出ていないか
- ページ表示速度に大きな問題がないか
表示だけでなく、実際にフォーム送信や購入テストなどの動作確認を行うことが大切です。
CMS・テーマ・プラグインを更新する
WordPressなどのCMSを使っている場合は、本体、テーマ、プラグインをPHP 8対応版へ更新します。
ただし、更新によってデザインや機能が変わる可能性もあるため、必ず事前にバックアップを取り、テスト環境で確認しましょう。
古い関数や非推奨の書き方を修正する
PHP 8で削除された関数や、非推奨になっている書き方を修正します。
特に以下のような記述は確認が必要です。
create_function
each(
__autoload
また、古いクラスではPHP 4形式のコンストラクタが残っている場合もあります。
class User {
function User() {
// 古いコンストラクタ
}
}
現在は、__construct()を使うのが一般的です。
class User {
function __construct() {
// 新しいコンストラクタ
}
}
エラーログを確認する
PHP 8へ切り替えた後は、画面表示だけでなくエラーログを確認します。
特に以下のようなエラーや警告に注意します。
- Fatal error
- Warning
- Deprecated
- TypeError
- ValueError
- Undefined array key
- Attempt to read property on null
画面上では問題なく見えていても、内部的には警告が出ている場合があります。
エラーログを確認しながら修正することが重要です。
PHP 7とPHP 8のどちらを使うべきか
新規構築ならPHP 8系を選ぶのが基本
これから新しくWebサイトやシステムを作る場合は、基本的にPHP 8系を選ぶべきです。
PHP 7系は公式サポートが終了しているため、セキュリティ面でも保守面でもおすすめできません。
ただし、PHP 8系なら何でもよいわけではありません。
利用しているCMS、フレームワーク、テーマ、プラグイン、サーバー環境が対応しているPHP 8系のバージョンを選ぶことが大切です。
既存サイトは慎重に移行する
既存サイトをPHP 7からPHP 8へ移行する場合は、慎重に進める必要があります。
特に、以下のようなサイトは注意が必要です。
- 古いWordPressテーマを使っている
- 更新されていないプラグインがある
- 独自カスタマイズが多い
- EC機能がある
- 予約機能がある
- 会員機能がある
- 古い独自CMSを使っている
- 制作当時の開発者が不在
このようなサイトでは、いきなり本番環境でPHP 8へ切り替えるのではなく、テスト環境で十分に検証してから移行する必要があります。
PHP 7とPHP 8の違いを理解する際の注意点
「PHP 8」と「PHP 8.0以降」は分けて考える
PHP 8といっても、PHP 8.0、8.1、8.2、8.3、8.4、8.5など複数のバージョンがあります。
PHP 8.0で追加された機能もあれば、PHP 8.1以降で追加された機能もあります。
そのため、「PHP 7とPHP 8の違い」を説明する場合は、主にPHP 7.4からPHP 8.0への大きな変更点を中心にしつつ、PHP 8系の中でもバージョンごとに違いがあることを理解しておく必要があります。
最新版が常に最適とは限らない
PHPの最新バージョンは、機能面やサポート期間では魅力があります。
しかし、実務では最新版が常に最適とは限りません。
CMS、フレームワーク、プラグイン、サーバー環境が最新バージョンに十分対応していない場合、不具合が起きる可能性があります。
そのため、実際の運用では「公式サポート対象であること」と「利用環境で安定して動作すること」の両方を考えてPHPバージョンを選ぶことが重要です。
まとめ
PHP 7とPHP 8の違いは、単なるバージョン番号の違いではありません。
PHP 8では、名前付き引数、match式、Nullsafe演算子、Union Types、mixed型、Attributes、コンストラクタプロパティ昇格、便利な文字列関数などが追加され、より分かりやすく安全なコードを書けるようになりました。
また、型チェックやエラー処理が厳しくなり、PHP 7では見過ごされていた不具合を発見しやすくなっています。
一方で、PHP 8では古い関数や古い書き方が削除されているため、PHP 7で動いていた古いコードがそのまま動かない可能性もあります。
特に、古いWordPressテーマ、更新されていないプラグイン、独自CMS、長年メンテナンスされていないシステムでは注意が必要です。
現在PHP 7系を使っている場合は、セキュリティや保守性の観点からPHP 8系への移行を検討するべきです。
ただし、いきなり本番環境で切り替えるのではなく、バックアップを取り、テスト環境で動作確認を行い、エラーログを確認しながら慎重に進めることが重要です。
PHP 8への移行は、単なるバージョンアップではなく、Webサイトやシステムを安全に長く運用するための重要な対応です。
以上、PHP7と8の違いについてでした。
最後までお読みいただき、ありがとうございました。










