Soalan tentang pengiraan rujukan dalam php?
迷茫
迷茫 2017-06-27 09:18:05
0
1
763

Apabila menguji PHP tentang pengiraan rujukan, saya melihat pembolehubah mempunyai bekas zval. Ia mengandungi dua atribut, satu ialah refcount dan satu lagi ialah_ref

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

Apabila menguji kiraan rujukan tatasusunan, keputusan dikembalikan seperti yang diharapkan

array (refcount=1, is_ref=0),
array (saiz=2)
'makna' => (refcount=1, is_ref=0), rentetan 'hidup' (panjang=4)
'nombor ' => (refcount=1, is_ref=0),int 42

Tetapi apabila menguji subjek. Ada soalan?

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

$class1 = new A();

xdebug_debug_zval('class1');

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

Tidak faham kenapa? Adakah ini akan menjadi 2? Daripada 1. Daripada seperti array php. Kiraan semula yang dijangkakan ialah 1

Dan dalam manual rasmi php. Penjelasan tentang jenis pematuhan mengenai pengiraan rujukan.
kiraan rujukan php

Perkara menjadi lebih rumit apabila melibatkan jenis komposit seperti tatasusunan dan objek Tidak seperti nilai jenis skalar, pembolehubah jenis tatasusunan dan objek menyimpan ahli atau sifatnya dalam jadual simbolnya sendiri.

.
迷茫
迷茫

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

membalas semua(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
``


Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan