PHP 中的弱映射是什么?

phpserver side programmingprogramming更新于 2025/10/9 0:37:17

弱映射是在 PHP 7.4 中添加的。当缓存引用对象实体类时,可以使用它来移除或删除对象。它引用这些对象,但这并不能避免对象被垃圾回收到内存中。在 PHP 8 中,弱映射允许我们存储与对象关联的随机数据,而不会泄漏任何内存。

换句话说,PHP 8 中的弱映射是一组键弱引用的对象。弱映射使用一个类来创建一个可用作键的对象,这可以帮助在不再有引用的情况下移除并销毁弱映射。从长远来看,它可以避免内存泄漏,最终提高性能。

我们可以说弱映射就像一个自动垃圾回收过程。每当一个变量被删除时,PHP 都会检查是否有任何变量仍在引用该对象。如果变量未引用,PHP 将安全地删除该对象。此过程称为垃圾收集。

示例:PHP 8 弱映射

<?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("对象被调用");
         return rand(1, 100);
      }
   }
   $cacheObject = new stdClass;
   $obj = new WeakExample;

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

   unset($cacheObject); // 取消设置对象,Weak Map 释放内存
   print_r(count($obj->cache));
?>

输出

对象调用 1 0

相关文章