PHP "&"

5 Cevap

Ben bir PHP programcısı değilim (ama diğer dilleri biliyorum) ve ben bazı değişiklikler yapmak için PHP (5.1.6) yapılan bir web sayfası anlamaya çalışıyorum.

Sayfa aşağıdaki kodu (basitleştirilmiş) vardır:

$db_hosts = array();
$sql = 'SELECT h.hostid, h.host FROM hosts h ';

$db_items = DBselect($sql);

while($db_item = DBfetch($db_items)){
   $name = $db_item['host'];
   $db_host = &$db_hosts[$db_item['hostid']];
}

Ben son satırı anlamaya çalışıyorum ne $db_host = &$db_hosts[$db_item['hostid']];

Bu yeni bir değişken $db_host yaratmak ve bunun içinde bir şeyler koyarak gibi görünüyor, ama anlamıyorum &$db_hosts.

Bildiğim kadarıyla, $db_hosts boş bir dizidir çünkü ben şüphe duyuyorum.

I this ve this bulundu, ancak bu bağlantılar, operatör "= &", ve kod, operatör bağlı olduğunu, çünkü pek emin değilim değişkeni "= & $ db_hosts" (it = ve & arasında bir boşluk vardır).

Bunu değiştirmek için çalıştı ve başarı var olmadığından, bunu yardım istemek için iyi olduğunu düşündüm ...

TIA,

Şilin

5 Cevap

Bu onlar C "pointer" veya C + + benzer, referanslar vardır.

Daha detaylı bilgi PHP manual.

$db_hosts boş olduğu, bu durumda, yapı $db_hosts[$db_item['hostid']], $db_item['hostid'] endeksi üzerinde boş bir madde ile yeni bir dizi oluşturmak ve öğenin başvuru dönecektir $db_hosts[$db_item['hostid']] şu anda ne için bir 'takma ad' olarak $db_host hareket yapıyor.

Bir referans sonra $ DB_HOST değiştirilirse eğer, $ db_hosts dizisindeki karşılık gelen bir giriş de değişecektir böylece yapar gibi bu değişken atama, ve tersi.

PHP, kargo kült tarzında referanslar oldukça anlamsız kullanımının adil bir bit gördüm. Belki de bu bir, belki de gerekli değil - Eğer programın kalanına bakmak gerekiyor.

& (see this manual section) Başvurular belirtmek için PHP çeşitli şekillerde kullanılan, ancak kendi başına bir operatör olarak düşünmek yanıltıcıdır. Aynı şey gelir, ama "referans-y-lık" atama bir özelliği olmadığını vurguluyor - Bazı insanlar yazmak $foo =& $bar ziyade $foo = &$bar tercih nedeni budur değişkenlerin.

C ya da C + + gibi bazı programlama dillerinde, belirli bir değişken "için bir başvuru almak" olabilir; Sonuç değeri ayrı bir varlık olarak etrafında geçti olabilir ve bu işaret daha sonra nereye "de-referanslı" bulmak için. Bu referanslar not ne PHP.

Bunun yerine, all PHP değişkenleri aslında bir zval adında bir iç türüne referanslar vardır. Doğrudan zval s PHP manipüle edemez ve ne de yönlendirme ekstra katmanları yapabilirsiniz - her değişken bir zval için bir referans olduğunu ve bu kadar. (Ihtar bakınız: aşağıda nesneleri.)

Ne bir atama-by-referans ($foo =& $bar), bir pass-by-referans (function foo(&$bar) { ... }), ya da bir iade-by-referans (return &$foo) do Eğer iki değişken aynı zval işaret etmek istiyorum ki PHP anlatmak. Her ikisi de eşit derecede "gerçek", ve ya tamamen bakir diğer bırakacaktır üzerine unset() çağrı - başka bir "at" bir değişkeni işaret olmadığını unutmayın.

Caveat: objects

Bu genellikle yanıltıcı PHP5 nesneler beri "her zaman referans olarak geçti" söyleniyor. Gerçek şu ki, zval, belirli bir nesneye bir işaretçi kendisi yönlendirme bir extra katmanı olması. variable, zval o işaret o object işaret ve: Bu bize başvurabilirsiniz üç farklı şeyler verir:

// Create an object, and point three variables at it in different ways:
$foo = new stdClass;
$bar_by_value = $foo;
$bar_by_ref =& $foo;

// Change the object: updates the object shared by all three variables
$foo->value = 42;
// Change the value (zval) of $foo: will update $bar_by_ref, 
//   but $bar_by_value still points at the original object
$foo = 42; 
// Change the variable itself: will never affect $bar_by_value or $bar_by_ref
unset($foo);

& Bir değişkene bir başvuru almak için kullanılır. Bazı önemli farklılıklar ile, C + + gibi diğer dillerde referanslara benzer. PHP Manual's section on references bakın.