WeakMap
Klassen WeakMap
(PHP 8)
Introduktion
En WeakMap är en karta (eller ordbok) som accepterar objekt som nycklar. Till skillnad från den liknande SplObjectStorage bidrar dock ett objekt i en WeakMap-nyckel inte till objektets referensräkning. Det vill säga, om den enda återstående referensen till ett objekt vid något tillfälle är nyckeln i en WeakMap, kommer objektet att skräpasamlas och tas bort från WeakMap. Dess primära användningsfall är att bygga cacheminnen av data som härleds från ett objekt och som inte behöver leva längre än objektet.
WeakMap implementerar ArrayAccess, Traversable (via IteratorAggregate) och Countable, så i de flesta fall kan det användas på samma sätt som en associativ array.
Klassöversikt
final class WeakMap implements ArrayAccess, Countable, IteratorAggregate { /* Metoder */ public count(): int public getIterator(): Iterator public offsetExists(object $object): bool public offsetGet(object $object): mixed public offsetSet(object $object, mixed $value): void public offsetUnset(object $object): void }
Exempel
Exempel #1 Användning av WeakMap
<?php $wm = new WeakMap(); $o = new stdClass; class A { public function __destruct() { echo "Dead!\n"; } } $wm[$o] = new A; var_dump(count($wm)); echo "Unsetting...\n"; unset($o); echo "Done\n"; var_dump(count($wm)); ?>
Ovanstående exempel kommer att ge något liknande:
int(1) Unsetting... Dead! Done int(0)
Innehållsförteckning
- WeakMap::count — Räknar antalet levande poster i kartan
- WeakMap::getIterator — Hämtar en extern iterator
- WeakMap::offsetExists — Kontrollerar om ett visst objekt finns i kartan
- WeakMap::offsetGet — Returnerar värdet som pekas på av ett visst objekt
- WeakMap::offsetSet — Uppdaterar kartan med ett nytt nyckel-värdepar
- WeakMap::offsetUnset — Tar bort en post från kartan
Fel exempel på användning av WeakMap
Exempel #1: Enkelt lagra objekt i en WeakMap
<?php $wm = new WeakMap(); $o = new stdClass; $wm[$o] = "Some value"; echo $wm[$o]; // Output: Some value ?>
Exempel #2: Objekt som tas bort när referensen försvinner
<?php $wm = new WeakMap(); $o = new stdClass; $wm[$o] = "This will disappear"; unset($o); var_dump($wm); // Output: WeakMap is now empty ?>
Exempel #3: Använda WeakMap för att cacha beräknade värden
<?php $wm = new WeakMap(); function compute($obj) { global $wm; if (!isset($wm[$obj])) { // Dyr beräkning $wm[$obj] = rand(); } return $wm[$obj]; } $o = new stdClass; echo compute($o); // Output: Beräknat och cachat värde ?>
Exempel #4: WeakMap för att hantera cirkulära referenser
<?php class Node { public $parent; public $children; } $parent = new Node(); $child = new Node(); $wm = new WeakMap(); $wm[$child] = $parent; $child->parent = $wm[$child]; ?>
Exempel #5: WeakMap för att hantera tilläggsdata för objekt
<?php class User { public $name; } $user = new User(); $user->name = "Alice"; $extraData = new WeakMap(); $extraData[$user] = ['loginCount' => 0]; // Uppdatera extra data $extraData[$user]['loginCount']++; echo $extraData[$user]['loginCount']; // Output: 1 ?>
Sidslut
Orginalhemsidan på Engelska : https://www.php.net/manual/en/class.weakmap.php
PHP
Språkreferens
Fördefinierade Gränssnitt och Klasser
Det här är en maskinöversättning av PHP-manualen till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på
https://www.linux.se/kontaka-linux-se/
Tack till Datorhjälp som har sponsrat Linux.se med webserver.