PHP7.2の特徴について

採用はこちら

PHP 7.2は、PHP 7系の2つ目の機能アップデートとしてリリースされたバージョンです。

PHP 7.0やPHP 7.1の流れを引き継ぎながら、型指定の改善・セキュリティ機能の強化・古い機能の整理が行われました。

代表的な変更点としては、object型の追加、Argon2によるパスワードハッシュ対応、Sodium拡張の標準追加、mcrypt拡張の削除などがあります。

一方で、PHP 7.2は現在すでに公式サポートが終了しています。

そのため、新規開発でPHP 7.2を採用するのはおすすめできません。

現在PHP 7.2で動いているシステムについても、PHP 8系への移行を検討する必要があります。

この記事では、PHP 7.2の主な特徴や変更点、実務で注意すべきポイントを詳しく解説します。

目次

PHP 7.2とは

PHP 7.2は、2017年11月30日にリリースされたPHPのバージョンです。

PHP 7系では、PHP 5系と比べて処理性能が大きく向上し、型宣言やエラー処理などの機能も強化されました。

PHP 7.2はその流れを受け継ぎ、より安全で保守しやすいコードを書けるようにするための改善が加えられています。

PHP 7.2の主な特徴は、以下の通りです。

項目内容
型指定の改善object型が追加された
セキュリティ強化PASSWORD_ARGON2Iによるパスワードハッシュに対応
暗号化機能の強化Sodium拡張が標準追加された
古い機能の整理mcrypt拡張が削除された
エラー検知の改善count()に不適切な値を渡した場合に警告が出るようになった
非推奨機能の追加create_function()each()__autoload()などが非推奨になった

PHP 7.2の主な新機能・変更点

object型が追加された

PHP 7.2では、型宣言にobject型を指定できるようになりました。

これにより、「何らかのオブジェクトを受け取る」「何らかのオブジェクトを返す」といった指定が可能になります。

function setData(object $data): void
{
    // $dataはオブジェクトであることが保証される
}

戻り値にもobject型を指定できます。

function getData(): object
{
    return new stdClass();
}

PHP 7.1以前でも、特定のクラス名やインターフェース名を型として指定することはできました。

しかし、「オブジェクト全般」を表す型は指定できませんでした。

PHP 7.2ではobject型が追加されたことで、より柔軟に型を表現できるようになりました。

ただし、実務では何でもobject型にすればよいわけではありません。

可能であれば、具体的なクラス名やインターフェース名を指定した方が、コードの意図が明確になります。

class User
{
    public $name;
}

function getUser(): User
{
    return new User();
}

object型は便利ですが、どのようなオブジェクトが返るのかが分かりにくくなる場合もあります。

保守性を重視するなら、具体的な型を指定するのが基本です。

Argon2によるパスワードハッシュに対応した

PHP 7.2では、password_hash()でArgon2を利用できるようになりました。

より正確には、PHP 7.2ではPASSWORD_ARGON2Iに対応しています。

$hash = password_hash('password123', PASSWORD_ARGON2I);

パスワードを保存する際は、平文のままデータベースに保存してはいけません。

必ずpassword_hash()などを使ってハッシュ化する必要があります。

PHP 7.2以前では、主にPASSWORD_BCRYPTが使われていました。

$hash = password_hash('password123', PASSWORD_BCRYPT);

PHP 7.2からは、Bcryptに加えてArgon2iも選択肢に入るようになりました。

ログイン処理では、保存されたハッシュと入力されたパスワードをpassword_verify()で照合します。

$password = 'password123';

$hash = password_hash($password, PASSWORD_ARGON2I);

if (password_verify($password, $hash)) {
    echo 'ログイン成功';
}

Argon2は、パスワードハッシュ用途を意識して設計されたアルゴリズムです。

PHP 7.2では、パスワード管理の安全性を高めるための選択肢が増えたといえます。

なお、PHP 7.3以降ではPASSWORD_ARGON2IDも利用できるようになっています。

Sodium拡張が標準追加された

PHP 7.2では、Sodium拡張が標準で追加されました。

Sodiumは、Libsodiumを利用した暗号化機能を扱うための拡張です。

Sodiumを使うことで、以下のような処理をより安全に実装しやすくなります。

  • データの暗号化
  • データの復号
  • デジタル署名
  • 署名の検証
  • 安全なランダム値の生成
  • 秘密鍵・公開鍵を使った暗号処理

例えば、秘密鍵を生成する場合は以下のように書けます。

$key = sodium_crypto_secretbox_keygen();

暗号化処理は、自前で実装すると脆弱性につながりやすい分野です。

PHP 7.2でSodium拡張が標準的に使えるようになったことは、セキュリティ面で大きな改善点です。

mcrypt拡張が削除された

PHP 7.2では、古くから使われていたmcrypt拡張がPHP本体から削除されました。

古いシステムでは、以下のような関数が使われていることがあります。

mcrypt_encrypt();
mcrypt_decrypt();

しかし、PHP 7.2ではmcrypt拡張が標準では使えません。

そのため、PHP 5系やPHP 7.0、PHP 7.1からPHP 7.2へ移行する際に、暗号化処理が原因でエラーになることがあります。

mcryptを使っている場合は、OpenSSLやSodiumなどへの置き換えが必要です。

例えば、OpenSSLを使った暗号化処理は以下のように書けます。

$data = 'secret text';
$key = 'your-secret-key';

$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-CBC'));

$encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);

ただし、暗号化処理は実装ミスが重大なセキュリティリスクにつながります。

実務では、フレームワークや信頼できるライブラリが提供している暗号化機能を使うのが安全です。

count()の扱いが厳密になった

PHP 7.2では、count()に配列またはCountableを実装したオブジェクト以外を渡した場合、警告が出るようになりました。

例えば、以下のようなコードです。

$value = null;

echo count($value);

PHP 7.2では、このようなコードで警告が発生します。

count()は、本来配列やカウント可能なオブジェクトに対して使う関数です。

そのため、値が配列かどうか分からない場合は、事前に確認する必要があります。

$value = null;

$count = is_array($value) ? count($value) : 0;

echo $count;

または、最初から配列として扱えるようにしておく方法もあります。

$items = $items ?? [];

echo count($items);

古いPHPでは、count(null)のようなコードが大きな問題にならずに動いていたケースがあります。

PHP 7.2では、こうした曖昧なコードを見つけやすくなりました。

抽象メソッド実装時の型指定が柔軟になった

PHP 7.2では、抽象メソッドを実装する際の型指定が一部柔軟になりました。

これは、parameter type wideningと呼ばれる変更です。

簡単にいうと、親クラスの抽象メソッドで指定されている引数の型を、子クラス側でより広く受け取れるようにする変更です。

例えば、以下のようなコードが可能になりました。

abstract class Base
{
    abstract public function test(array $input);
}

class Child extends Base
{
    public function test($input)
    {
        return $input;
    }
}

親クラスではarray $inputと指定していますが、子クラスでは型指定を外しています。

子クラス側の方がより広い値を受け取れるため、互換性のある実装として扱われます。

この変更は、一般的なWebサイト制作ではあまり意識しないかもしれません。

しかし、フレームワークやライブラリ、抽象クラスを多用する大規模なアプリケーションでは重要な改善です。

配列とオブジェクトの数値キー変換が改善された

PHP 7.2では、配列とオブジェクトを相互にキャストしたときの数値キーの扱いも改善されました。

例えば、配列をオブジェクトに変換したり、オブジェクトを配列に変換したりするコードでは、キーの扱いが問題になることがあります。

$array = [1 => 'apple', 2 => 'orange'];

$object = (object) $array;

一般的なWeb制作では頻繁に意識する変更ではありませんが、配列とオブジェクトの変換を多用するコードでは影響する場合があります。

APIレスポンスの整形、JSONデータの処理、独自のデータ変換処理などを行っている場合は、動作確認しておくと安心です。

HashContextがオブジェクトになった

PHP 7.2では、ハッシュ処理に関するHashContextがオブジェクトとして扱われるようになりました。

例えば、hash_init()を使ったハッシュ処理では、内部的にHashContextが使われます。

$context = hash_init('sha256');

hash_update($context, 'sample text');

echo hash_final($context);

この変更は、通常のWeb制作では大きな影響が出にくい部分です。

しかし、ハッシュ処理を細かく扱うライブラリや独自処理では、互換性確認が必要になる場合があります。

PHP 7.2で非推奨になった機能

create_function()が非推奨になった

PHP 7.2では、create_function()が非推奨になりました。

古いPHPコードでは、以下のような書き方が使われていることがあります。

$func = create_function('$a, $b', 'return $a + $b;');

echo $func(1, 2);

create_function()は、文字列として渡したコードを関数として作成する仕組みです。

可読性が低く、セキュリティ上の問題も起こりやすいため、PHP 7.2で非推奨になりました。

代わりに、無名関数を使います。

$func = function ($a, $b) {
    return $a + $b;
};

echo $func(1, 2);

現在のPHPでは、無名関数やアロー関数を使うのが一般的です。

ただし、アロー関数はPHP 7.4以降の機能なので、PHP 7.2では使えません。

each()が非推奨になった

PHP 7.2では、配列を処理するeach()も非推奨になりました。

古いコードでは、以下のような書き方が使われていることがあります。

while (list($key, $value) = each($array)) {
    echo $key . ':' . $value;
}

このような処理は、現在ではforeachで書くのが基本です。

foreach ($array as $key => $value) {
    echo $key . ':' . $value;
}

foreachの方が読みやすく、処理の意図も分かりやすくなります。

PHP 7.2以降に対応するコードを書く場合は、each()ではなくforeachへ置き換えましょう。

__autoload()が非推奨になった

PHP 7.2では、クラスの自動読み込みに使われていた__autoload()も非推奨になりました。

古いPHPでは、以下のようなコードが使われることがありました。

function __autoload($className)
{
    require $className . '.php';
}

PHP 7.2以降では、spl_autoload_register()を使うのが適切です。

spl_autoload_register(function ($className) {
    require $className . '.php';
});

さらに、現在のPHP開発ではComposerのオートロードを使うのが一般的です。

require __DIR__ . '/vendor/autoload.php';

LaravelやSymfonyなどのフレームワークを使う場合も、Composerによる自動読み込みが前提になっています。

PHP 7.2で実務上注意すべきポイント

古い暗号化処理が動かなくなる可能性がある

mcryptを使っているコードは、PHP 7.2ではそのまま動作しない可能性があります。

mcrypt_encrypt();
mcrypt_decrypt();

古い会員サイト、予約システム、ECサイト、独自CMSなどでは、過去にmcryptが使われているケースがあります。

PHP 7.2以降へ移行する場合は、暗号化処理の確認が必要です。

count()で警告が出る可能性がある

以下のようなコードは、PHP 7.2で警告が出る可能性があります。

$count = count($value);

$valueが常に配列であれば問題ありません。

しかし、nullや文字列、数値が入る可能性がある場合は注意が必要です。

安全に書くなら、次のようにします。

$count = is_array($value) ? count($value) : 0;

また、PHP 7.3以降ではis_countable()も使えますが、PHP 7.2では標準では使えません。

古い関数を使ったコードの修正が必要になる

PHP 7.2では、いくつかの古い関数や仕組みが非推奨になっています。

代表的なものは以下です。

create_function()
each()
__autoload()

これらを使っているコードは、すぐに動かなくなるとは限りません。

しかし、将来的なPHPバージョンでは削除される可能性があるため、早めに置き換えるべきです。

古いWordPressテーマやプラグインでエラーが出る場合がある

WordPress本体がPHP 7.2に対応していても、古いテーマやプラグインがPHP 7.2に対応していない場合があります。

特に、以下のようなコードが含まれている場合は注意が必要です。

create_function()
each()
__autoload()
mcrypt_encrypt()
mcrypt_decrypt()

WordPressサイトでPHPのバージョンを変更する場合は、本番環境でいきなり変更せず、ステージング環境やテスト環境で動作確認するのがおすすめです。

PHP 7.2のメリット

セキュリティ機能が強化された

PHP 7.2では、Argon2iによるパスワードハッシュやSodium拡張の追加により、セキュリティ関連の機能が強化されました。

特に、ログイン機能や会員登録機能を持つWebサービスでは、パスワード管理や暗号化処理の安全性が重要です。

PHP 7.2では、より現代的なセキュリティ機能を利用できるようになりました。

型指定がより便利になった

object型の追加により、型宣言の表現力が上がりました。

function handle(object $item): void
{
    // オブジェクトのみを受け取る
}

型を明示することで、コードの意図が分かりやすくなり、バグの発見もしやすくなります。

古いコードを見直すきっかけになる

PHP 7.2では、mcryptの削除やcreate_function()each()__autoload()の非推奨化など、古い機能の整理が進みました。

一時的には修正作業が必要になる場合がありますが、長期的にはコードの安全性や保守性を高めるきっかけになります。

PHP 5系より高速

PHP 7系は、PHP 5系と比べて大きくパフォーマンスが改善されています。

PHP 7.2もその流れを引き継いでおり、古いPHP 5系から移行した場合、処理速度の改善が期待できます。

WordPressや独自CMS、PHP製のWebアプリケーションでは、PHP 5系からPHP 7系へ移行することで、ページ表示速度やサーバー負荷の改善につながることがあります。

PHP 7.2のデメリット・注意点

すでに公式サポートが終了している

PHP 7.2は、現在すでに公式サポートが終了しています。

そのため、PHP本体に脆弱性が見つかったとしても、公式のセキュリティ修正は期待できません。

現在PHP 7.2で本番運用している場合は、PHP 8系への移行を検討する必要があります。

特に、以下のようなサイトでは注意が必要です。

  • ECサイト
  • 会員制サイト
  • 予約サイト
  • 決済機能を持つサイト
  • 個人情報を扱うサイト
  • 管理画面を持つWebサービス
  • WordPressで多数のプラグインを使っているサイト

このようなサイトでPHP 7.2を使い続けるのは、セキュリティ面でリスクがあります。

最新のライブラリやフレームワークが使えない場合がある

現在のLaravel、Symfony、Composerパッケージ、WordPress関連ツールなどでは、PHP 7.2をサポート対象外としているものが増えています。

PHP 7.2のままだと、以下のような問題が起こる可能性があります。

  • ライブラリを最新版に更新できない
  • セキュリティアップデートを適用できない
  • Composerの依存関係解決で失敗する
  • 新しいフレームワークを導入できない
  • サーバー移行時にPHP 7.2が選べない

そのため、PHP 7.2を使い続けるほど、保守や運用の難易度が高くなります。

PHP 8系への移行時に互換性問題が出る可能性がある

PHP 7.2からPHP 8系へ移行する場合、互換性の問題が出ることがあります。

特に、古いコードでは以下のような部分に注意が必要です。

  • 非推奨関数の使用
  • 古いクラス自動読み込み
  • count()の不適切な使用
  • 型宣言に合わない値の受け渡し
  • 古いライブラリやプラグイン
  • 独自実装の暗号化処理

いきなり本番環境のPHPバージョンを上げるのではなく、テスト環境でエラーや警告を確認してから移行することが重要です。

PHP 7.2から移行する場合の流れ

現在のPHPコードを確認する

まずは、PHP 7.2で問題になりやすいコードが残っていないか確認します。

特に以下の関数や書き方はチェックしておきましょう。

mcrypt_encrypt()
mcrypt_decrypt()
create_function()
each()
__autoload()
count($value)

count($value)については、$valueが常に配列またはCountableであるかを確認する必要があります。

利用しているライブラリを確認する

Composerを使っている場合は、composer.jsonを確認します。

{
  "require": {
    "php": "^7.2"
  }
}

PHP 8系へ移行する場合は、利用しているパッケージがPHP 8に対応しているか確認しましょう。

古いパッケージがPHP 8に対応していない場合は、代替パッケージへの移行や、アプリケーション側の修正が必要になることがあります。

WordPressの場合はテーマとプラグインを確認する

WordPressサイトの場合は、PHP本体だけでなく、テーマやプラグインの対応状況も重要です。

確認すべき項目は以下です。

  • WordPress本体のバージョン
  • 使用中テーマの更新状況
  • 使用中プラグインの更新状況
  • 自作テーマのPHPコード
  • functions.phpの記述
  • 古いショートコードや独自機能
  • サーバーで選択できるPHPバージョン

古いテーマやプラグインを使っている場合、PHP 8系へ移行した際にエラーが出ることがあります。

事前にバックアップを取り、テスト環境で確認してから本番に反映しましょう。

PHP 7.2の特徴まとめ

PHP 7.2は、PHP 7系の中でもセキュリティと型指定の改善が目立つバージョンです。

主な特徴は以下の通りです。

  • object型が追加された
  • PASSWORD_ARGON2Iによるパスワードハッシュに対応した
  • Sodium拡張が標準追加された
  • mcrypt拡張がPHP本体から削除された
  • count()に不適切な値を渡した場合に警告が出るようになった
  • 抽象メソッド実装時のparameter type wideningに対応した
  • create_function()each()__autoload()が非推奨になった
  • 配列とオブジェクトの数値キー変換が改善された
  • PHP 5系より高いパフォーマンスが期待できる

PHP 7.2は、当時としてはセキュリティ面・パフォーマンス面・型指定の面で大きな改善が加えられたバージョンです。

しかし、現在はすでに公式サポートが終了しているため、本番環境で使い続けるのはおすすめできません。

学習目的でPHP 7.2の特徴を理解することは有益ですが、実際の開発や運用ではPHP 8系への移行を前提に考えるべきです。

以上、PHP7.2の特徴についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次