वीक मैप्स 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("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); // ऑब्जेक्ट्स और वीक मैप्स को अनसेट करने से मेमोरी मुक्त होती है
print_r(count($obj->cache));
?>
आउटपुट
Object called 1 0