2016-03-25 52 views
-1

$a = & $b;'u içeren bir kod snippet'i ile karşılaştım, ancak gerçekten var olup olmadığını test etmemiştim (if (isset($b))). PHP'nin bunu nasıl işlediğinden emin değildim, bu yüzden hızlı bir test yaptım ve şimdi daha da meraklıyım.PHP "Referansa göre ata" tuhaflığı

$a = array('a'=>'b', 'x'=>'y'); 

$b = array(); 

$b[10] = &$a['a']; 
$b[11] = &$a['ppp']; 

var_dump($a); 
var_dump($b); 
echo (isset($a['ppp']) ? "SET" :" NOT SET") . "\n"; 
echo (isset($b[11]) ? "SET" :" NOT SET") . "\n"; 

O çıplak kod ama ne çıktı gösterir: Sadece $b[11] = &$a['ppp'] çıplak atama yeterlidir

  • , var_dump($a) hiçbir atama için yapılmış olsa bile, 3 üye değil 2 olarak bildirilmiştir $a['ppp']. $a['ppp'], bir değere (NULL) sahip olduğu, ancak ayrıca isset()=FALSE olduğu bildirilmiştir.

    arada aynı anda
  • , $b[11] bir değer NULL ve isset()=FALSE gösterir olsa da, belirtil (görünüşte) yapar mevcut (!)

ben kontrol ilk 'sorunu' giderdiği takdir, ama esas olarak daha derin bir anlayışa bakıyorum. Ne oluyor? atamak, pas veya tanımlanmamış bir değişken dönerseniz

+0

"NOT NULL" olduğunda "set" değeri –

+0

Bu senaryoda bu kadar meraklıysanız, neden tartışmaya katılmıyorsunuz? –

cevap

0

açıklanması, bu oluşturulmuş olur bu

kadar basittir.

(vurgu benim) ne yaptığınızı var

; Tanımsız bir endeksi referans ile atama böylece oluşturulmaktadır. Aynı zamanda arada

, $ b: tanımsız değişkenler

<?php 
function foo(&$var) { } 

foo($a); // $a is "created" and assigned to null 

$b = array(); 
foo($b['b']); 
var_dump(array_key_exists('b', $b)); // bool(true) 

$c = new StdClass; 
foo($c->d); 
var_dump(property_exists($c, 'd')); // bool(true) 
?> 

Example from PHP Manual

ile

Örnek 1. Kullanma referanslar Sonra başka bir sorum var [11] NULL ve isset() = FAL değerini gösterir. SE onun referent (görünüşte) mevcut olsa bile aynı zamanda manuel

isset açıkça anlatılmıştır

(!) - belirleyin değişken kurmak ve NULL değilse kullanılabilir

isset() ayarlanmış bir değişken test

NULL saptarsa ​​döndürür

NULL olduğundan, isset() FALSE değerini döndürür.

0

slotu, bir başka değişkenin takma ismini alabilmeniz için var (burada gerçekten neler oluyor, PHP'nin "referansları", her "referans olarak", gerçekte olduğu kadar gerçek şeyler değildir. kopyalama ile aliasing değiştirilen normal bir işlemdir), ancak null olmayan bir değer içermesi gerekmez ve siz onu atayamaz (adlarından biriyle).