Bilginize:
refcount
hakkında
Bu işlevden döndürülen refcount
değeri, motorun
gerçeklenimi ayrıntılı bir şekilde anlaşılmadan şaşırtıcı olabilir.
Zend motoru gönderim sayısını (refcount) iki farklı amaç için kullanır:
-
Aynı değeri tutan birden çok değişkenin bellekteki aynı kopyayı işaret
ettiği "yazarken kopyala" adı verilen bir teknik kullanarak bellek
kullanımını en iyileme. Değişkenlerden herhangi biri değiştirildiğinde,
bellekte yeni bir kopyaya işaret edilir ve özgün kopya üzerindeki
gönderim sayısı 1 azaltılır.
-
Gönderimle atanmış veya aktarılmış izleme değişkenleri (bkz. Gönderimlerle İlgili Herşey ).
Bu gönderim sayısı, geçerli değer için zval'i işaret eden ayrı bir
gönderim zval'ı üzerinde saklanır. Bu ek zval şu anda
debug_zval_dump() tarafından gösterilmemektedir.
debug_zval_dump() girdisini değeriyle aktarılan normal
bağımsız değişkenler olarak aldığından, bunları aktarmak için "yazarken kopyala"
tekniğini kullanacaktır: verileri kopyalamak yerine, işlev çağrısının ömrü
boyunca gönderim sayısını bir artıracaktır. İşlev, bağımsız değişkeni aldıktan
sonra değiştirseydi, bir kopyası yapılırdı; öyle olmadığından, gösterilen
gönderim sayısı çağrı etki alanındakinden bir fazla olur.
Bağımsız değişken aktarımı ayrıca, gönderimle atanan değişkenleri
debug_zval_dump() işlevinin göstermesini de önler.
Örneklerle açıklamak gerekirse, yukarıdaki örneğin biraz değiştirilmiş
bir halini ele alalım:
<?php
$var1 = 'Hello';
$var1 .= ' World';
// Aynı değere gönderim olarak üç değişkene vurgu yapalım
$var2 =& $var1;
$var3 =& $var1;
debug_zval_dump($var1);
?>
Yukarıdaki örneğin çıktısı:
string(11) "Hello World" refcount(2)
$var1, $var2 ve
$var3 gönderim olarak ilintili olsa da,
debug_zval_dump() işlevine yalnızca bir
değer aktarılır. Bu değer, bir kez gönderim kümesi
tarafından ve bir kez de debug_zval_dump() içinde
kullanılır, bu nedenle gönderim sayısı (refcount) 2 olur.
Motorda farklı veri türleri için yapılan en iyilemeler nedeniyle daha
fazla karışıklık ortaya çıkar. Tamsayılar gibi bazı türler "yazarken
kopyala" kullanmazlar, bu nedenle bir refcount gösterilmez. Diğer
durumlarda, refcount dahili olarak kullanılan fazladan kopyaları da
gösterir, örneğin bir sayıl dize veya dizinin bir göstericiyle saklanması
gibi.