Fragen zur Referenzzählung in PHP?
迷茫
迷茫 2017-06-27 09:18:05
0
1
755

Als ich PHP zum Thema Referenzzählung getestet habe, habe ich gesehen, dass eine Variable einen Zval-Container hat. Es enthält zwei Attribute, eines ist refcount und das andere ist_ref

$array= array( 'meaning' => 'life', 'number' => 42 );
xdebug_debug_zval( 'array' );

Beim Testen des Referenzzählers des Arrays werden die Ergebnisse wie erwartet zurückgegeben

array (refcount=1, is_ref=0),
array (size=2)
'meaning' => (refcount=1, is_ref=0),string 'life' (length=4)
'number ' => (refcount=1, is_ref=0),int 42

Aber beim Testen von Probanden. Eine Frage haben?

class  A{
    private $a1;
    public  $a2;
}

$class1 = new A();

xdebug_debug_zval('class1');

class1:
(refcount=1, is_ref=0),
object(A)[1]
private 'a1' => (refcount=2, is_ref=0),null
public 'a2' => ; (refcount=2, is_ref=0),null

Verstehen Sie nicht ganz, warum? Wird das 2 sein? Anstelle von 1. Anstelle eines PHP-Arrays. Der erwartete Refcount scheint 1

zu sein

Und im offiziellen PHP-Handbuch. Eine Erläuterung konformer Typen bezüglich der Referenzzählung.
php-Referenzanzahl

Bei zusammengesetzten Typen wie Array und Objekt ist die Sache etwas komplizierter. Im Gegensatz zu Werten vom Skalartyp speichern Variablen von Array- und Objekttypen ihre Mitglieder oder Eigenschaften in ihren eigenen Symboltabellen.

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

Antworte allen(1)
给我你的怀抱
PHP 5.6.19 显示如下

class X{
    private $a;
    public $b;
}

$x = new X();

xdebug_debug_zval("x");

(refcount=1, is_ref=0),
object(X)[3]
private 'a' => (refcount=1, is_ref=0),null
public 'b' => (refcount=1, is_ref=0),null
PHP Version:7.0.4

相同代码测试结果

x:
(refcount=1, is_ref=0)
object(X)[3]
  private 'a' => (refcount=0, is_ref=0)null
  public 'b' => (refcount=0, is_ref=0)null 

PHP7中简单值直接使用zval容器存储,不再使用指向zval的指针,
也就是说PHP7操作变量是直接操作zval结构体,简单值不再参与垃圾回收
页不再参与引用计数,简单值得赋值直接拷贝,而不再计算引用计数
echo "<hr>PHP7简单值";
$m = 1;
$n = $m;
xdebug_debug_zval("m");
xdebug_debug_zval("n");

PHP7简单值m:
(refcount=0, is_ref=0)int 1
n:
(refcount=0, is_ref=0)int 1
如果简单值被引用了,则结果如下

echo "<hr>PHP7简单值被引用";
$m = 1;
$n = &$m;
xdebug_debug_zval("m");
xdebug_debug_zval("n");

m:
(refcount=2, is_ref=1)int 1
n:
(refcount=2, is_ref=1)int 1

可见当n引用m后,n、m指向同一个变量,引用计数为2,引用为true

unset($n);
m:
(refcount=1, is_ref=1)int 1
n:
(refcount=0, is_ref=0)*uninitialized*

可见unset掉n后,原变量的引用计数减为1,引用仍为true
``


Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage