PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPのWeakMap(ウィークマップ)とは?仕組みと使い方を徹底解説

WeakMap(ウィークマップ)とは

WeakMapはPHP 8.0で導入されたクラスです。キャッシュなどがエンティティクラスのオブジェクトを参照している場合でも、そのオブジェクトを問題なく削除・解放できるよう設計されています。WeakMapからの参照は「弱い参照」であるため、オブジェクトのガベージコレクションを妨げません。これにより、オブジェクトに紐づく任意のデータを、メモリリークを起こすことなく保存できます。

言い換えると、PHP 8のWeakMapとは、キーがオブジェクトを弱く参照するマップです。キーとして使われていたオブジェクトへの参照が他に一つもなくなれば、そのエントリはWeakMapから自動的に取り除かれます。長期的に見てもメモリリークを回避でき、アプリケーション全体のパフォーマンス向上につながります。

WeakMapは、自動的なガベージコレクションのような働きをすると言えます。変数が削除されるたびに、PHPはそのオブジェクトをまだ参照している変数が他に存在するかどうかを確認します。どこからも参照されていない場合は、PHPはそのオブジェクトを安全に破棄します。この一連の処理こそがガベージコレクションと呼ばれるものです。

サンプルコード:PHP 8でのWeakMap

<?php
class WeakExample {
    public WeakMap $cache;
    public function __construct() {
        $this->cache = new WeakMap();
    }
    public function getCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }
    public function computeSomethingExpensive(object $obj) {
        print_r("Object called");
        return rand(1, 100);
    }
}
$cacheObject = new stdClass;
$obj = new WeakExample;

$obj->getCaching($cacheObject);
$obj->getCaching($cacheObject);
print_r(count($obj->cache));

unset($cacheObject); // オブジェクトを解放すると、WeakMapのエントリも自動的に削除され、メモリが解放される
print_r(count($obj->cache));
?>

実行結果

Object called 1 0

コードの解説

この例では、負荷の高い計算(computeSomethingExpensive)の結果をWeakMapにキャッシュしています。最初のgetCaching()呼び出しでは計算が実行されて「Object called」が出力されますが、2回目の呼び出しではキャッシュが利用されるため、再計算は行われません。

最初の count($obj->cache) の出力は「1」であり、キャッシュに1件のエントリが存在することを示しています。しかし、unset($cacheObject) によってキーとなるオブジェクトへの参照がなくなると、WeakMap内のエントリは自動的に削除され、2回目のカウントは「0」になります。これがWeakMapによるメモリリーク防止の基本的な仕組みです。

  1. PHPファイルとは?開き方・編集・変換方法をわかりやすく解説

    PHPファイルとは .phpという拡張子を持つファイルは、PHP(Hypertext Preprocessor)のソースコードが記述された「PHPソースコードファイル」です。主にWebページのファイルとして利用され、Webサーバー上で動作するPHPエンジンによってHTMLを生成します。 ブラウザに表示されるのは、PHPエンジンがコードから生成したHTMLコンテンツです。PHPコードはサーバー側で実行されるため、PHPページにアクセスしてもコードそのものは見えず、サーバーが生成したHTMLだけを受け取る仕組みになっています。 なお、PHPソースコードファイルの中には、.phtml、.php3、.

  2. ファイルインクルージョン攻撃と任意のコード実行とは?WordPressサイトを狙う脅威の仕組みを徹底解説

    ファイルインクルージョンと任意のコード実行(Arbitrary Code Execution)について — 先月、WordPressで構築された航空券予約サイトがハッキングされ、数十万人に上る訪問者の個人情報が漏洩するという事件が発生しました。以前の記事「ハッカーはなぜハッキングを行うのか」では、データ窃取やスパムメール送信、さらにはブラックハットSEO(※関連記事:ファーマハック参照)によって自社製品を上位表示させるなど、ハッカーが攻撃を行うさまざまな動機について解説しました。 ハッカーがどのようにWebサイトを攻撃するのかを理解することは、防御への第一歩です。そのため、過去の記事ではWo