13

これは、以下の推論を描くために使用したコードとその出力です。

 class a {
    public $var1;
    public $var2;
    }

 $obj0 = new a;
 var_dump($obj0);

 class b {
    public $var1;
    public $var2;
    public $var3;
    }

 $obj1 = new b;
 var_dump($obj1);

 $obj2 = new stdClass;
 var_dump($obj2);

 $obj3 = new stdClass;
 var_dump($obj3); 

 $obj4 = new stdClass;
 var_dump($obj4);

 $obj5 = new stdClass;
 var_dump($obj5);

 var_dump(new stdClass); 

 $obj6 = new stdClass;
 var_dump($obj6);  

出力:

object(a)#1 (2) {
  ["var1"]=> NULL
  ["var2"]=> NULL
}
object(b)#2 (3) {
  ["var1"]=> NULL
  ["var2"]=> NULL
  ["var3"]=> NULL
}
object(stdClass)#3 (0) {

}
object(stdClass)#4 (0) {

}
object(stdClass)#5 (0) {

}
object(stdClass)#6 (0) {

}
object(stdClass)#7 (0) {

}
object(stdClass)#7 (0) {

}

オブジェクトの行の#<some-number>隣は実際object(someClass)にはです。どこ、var_dump#<count>

countは、これまでに作成されたオブジェクトが属するクラスに関係なく、オブジェクトのオブジェクト/ zvalの数です。これは、作成されたすべてのオブジェクトに対してインクリメントを続け、zvalのrefcountがゼロに達すると1ずつデクリメントされます。つまり、ガベージコレクションです。

私は正しいですか?

4

2 に答える 2

19

その数はZ_OBJ_HANDLE_PP(struc)struczvalにつながるであり、 がZ_OBJVAL(zval).handleにつながる(zval).value.objです。

も参照してくださいhttp://php.net/manual/en/internals2.variables.intro.php

要するに、それは 10 進数形式 ( ref )で記述されたオブジェクト識別子だと言えます。

php_printf("%sobject(%s)#%d (%d) {\n", COMMON, class_name, Z_OBJ_HANDLE_PP(struc), myht ? zend_hash_num_elements(myht) : 0);

これまでに作成されたオブジェクトの数ではありません。

于 2012-01-09T12:05:11.447 に答える
8

いいえ、オブジェクトインスタンスへの内部参照です。

var_dump($obj1); 

繰り返しますが、それでもID#2になります

編集

あなたの場合

var_dump(new stdClass);

PHPはstdClassの新しいインスタンスを作成し、var_dumpを使用してそれをダンプし、インスタンス#7を提供します。ただし、このインスタンスは一時的であるため(変数に割り当てていないため)、直後に再び破棄されます。そのため、オブジェクトID#7は、で作成する次のオブジェクトに割り当てるために再び使用できます。

$obj6 = new stdClass; 
于 2012-01-09T11:47:03.980 に答える