recherche

Maison  >  Questions et réponses  >  le corps du texte

Des questions sur le comptage de références en php ?

Lors du test de PHP sur le comptage de références, j'ai vu qu'une variable avait un conteneur zval. Il contient deux attributs, l'un est refcount et l'autre is_ref

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

Lors du test du nombre de références du tableau, les résultats sont renvoyés comme prévu

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

Mais lors des tests de sujets. Avoir une question?

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

Vous ne comprenez pas très bien pourquoi ? Est-ce que ce sera le 2 ? Au lieu de 1. Au lieu de ressembler à un tableau php. Le recompte attendu semble être 1

Et dans le manuel officiel php. Une explication des types conformes concernant le comptage de références.
nombre de références php

Les choses sont un peu plus compliquées lorsqu'il s'agit de types composites comme un tableau et un objet Contrairement aux valeurs de type scalaire, les variables de type tableau et objet stockent leurs membres ou propriétés dans leurs propres tables de symboles.

迷茫迷茫2790 Il y a quelques jours789

répondre à tous(1)je répondrai

  • 给我你的怀抱

    给我你的怀抱2017-06-27 09:20:05

    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
    ``
    
    
    

    répondre
    0
  • Annulerrépondre