Başvurular üzerinden PHP belirtilmemiştir

4 Cevap php

Ben başvurular hakkında PHP kitabını okuyordum ve bir şey beni karıştırıyor. Bu referanslar bellek adresleri göstericiler değil olmadığını söylüyor ...

Instead, they are symbol table aliases.

Bu aslında bir gösterici değil ise başvuru sonra bir bellek adresine işaret sembol tablosu girişine noktaları?

Edit:

Bazı büyük yanıtlar. Sadece burada bu pop istiyorum ... Nasıl bir işaret olduğu için değişken unset istiyorsunuz?

$var = "text";
$ref =& $var;
unset($ref);

Bu çalışması için gibi görünüyor, ben GC onu kaldırır yüzden de $var unset gerekir.

4 Cevap

Orada harika bir PHP References Tutorial which should explain everything in a more in depth manner than the PHP docs themselves (gasp), hatta şimdiye kadar değişken yaratma üzerine ne açıklamak için olacak.

PHP internally implements variable values through a structure know as a _zval_struct, generally referred to simply as a zval. In addition to storing the value and information about its type, the zval also specifies a refcount. The refcount counts the number of references to the value and is essential to the operation of the garbage collector, allowing memory to be freed when it is no longer in use.

A reference in PHP is simply a variable corresponding to the same zval as another variable. References can be explicitly created using a special form of the assignment operate with an ampersand after the equals sign.

Nokta Eğer bazı diğer dillerde olabilir gibi "işaretçi + +" gibi bir şey yapabilirim bu diğer dillerde, örneğin C için, "pointer" konulu aritchmetic işlemleri yapmak ve böylece bellekte bir adım ileri gidemez ki. Bu PHP mümkün değildir.

Bu unset () aslında referansı değil, değer kaldırır, çünkü bir referans üzerinden bir değişken unset mümkün değildir. Çöp toplayıcısı daha sonra orijinal değişken ismi de dahil olmak üzere herhangi bir başvuru yok her değişken temizler.

Ve bu iyi bir şeydir. Özel değişkenlerde üçüncü bir başvurular tutan iki nesne düşünün. Bir nesne, özel bir değişken olduğunu tanımsız yapar ise, diğeri etkilenmemiş olacaktır.

Eğer referanslar yoluyla yoketmek olabilir eğer özel / kamu modelini ihlal eder.

PHP global or $GLOBALS

From @Artefacto: "Inside a function, if you want to unset a global variable, you must use unset($GLOBALS['varname']), not global $varname; unset($varname);."