WeakMap

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

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

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.