Schwache Referenzen
Verfasst: Mi Dez 21, 2016 9:02 pm
Moin zusammen. Ich bin grad am überlegen & suchen, wie man schwache Referenzen in PHP hin bekommt. Es gibt eine externe PECL Biblitohek, aber ich dachte ich versuche es mal so. Dabei fiel mir etwas auf: PHP scheint die $this Variable speziell zu behandeln. Ich habe als Beispiel diesen Code:
Der die folgende Ausgabe erzeugt:
Ich hätte aber diese Ausgabe erwartet:
da ich ja mit expliziten Referenzen gearbeitet habe. Dennoch entsteht scheinbar eine zyklische Referenz und ich bin mir nicht ganz sicher warum. Mache ich die "Verlinke" nämlich "manuell", scheint alles zu klappen:
Das gibt mir (wie erwartet) folgende Ausgabe:
Und wenn ich $a = null; weglassen, bekomme ich (auch wie erwartet)
Also scheint das ganze nur zu passieren, wenn $this verwendet wird.
Code: Alles auswählen
<?php
class A
{
public $b;
public function __construct()
{
$this->b = new B($this);
}
public function __destruct()
{
print 'A::DTor' . PHP_EOL;
}
}
class B
{
public $a;
public function __construct(A &$a)
{
$this->a = &$a;
}
public function __destruct()
{
print 'B::DTor' . PHP_EOL;
}
}
function foo()
{
print 'foo starts' . PHP_EOL;
$a = new A();
$a = null;
print 'foo ends' . PHP_EOL;
}
foo();
print 'end' . PHP_EOL;
Code: Alles auswählen
foo starts foo ends end A::DTor B::DTor
Code: Alles auswählen
foo starts foo ends A::DTor B::DTor end
Code: Alles auswählen
<?php
class A
{
public $b;
public function __destruct()
{
print 'A::DTor' . PHP_EOL;
}
}
class B
{
public $a;
public function __destruct()
{
print 'B::DTor' . PHP_EOL;
}
}
function foo()
{
print 'foo starts' . PHP_EOL;
$a = new A();
$b = new B();
$a->b = &$b;
$b->a = &$a;
$a = null;
print 'foo ends' . PHP_EOL;
}
foo();
print 'end' . PHP_EOL;
Code: Alles auswählen
foo starts A::DTor foo ends B::DTor end
Code: Alles auswählen
foo starts foo ends end A::DTor B::DTor