2014-01-26 15 views
3

我非常驚訝PHP的行爲如此奇怪。在構建多維數組時,似乎在最後的);關閉之前,您無法訪問子數組的變量。當定義的變量可以在多維數組內部訪問嗎?

例子:

$config['debug']    = array(
     'type'     => array(
      'remote_specific' => true, 
      'remote_addr'  => '1.2.3.4', 
     ), 
     'mode'    => array(
      'PHP'    => ($config['debug']['type']['remote_specific'] && $config['debug']['type']['remote_addr'] == $_SERVER['REMOTE_ADDR']) ? true : true, 
      'PDO'    => ($config['debug']['type']['remote_specific'] && $config['debug']['type']['remote_addr'] == $_SERVER['REMOTE_ADDR']) ? true : false 
     ) 
    ); 

你只會得到一個錯誤:PHP Notice: Undefined variable: config in ..

Online example

似乎PHP被關閉父陣列的);後寫入存儲器。

我在這裏錯過了什麼?

回答

4

在大多數語言中,賦值(A = B)實際上是一個兩個步驟的過程:首先將整個右邊的操作數(B中的例子)進行評估,然後將該評估的結果被分配給左邊的操作數(A)。在B的評估中,A的分配尚未發生;而B正在評估它不連續地發生,但是作爲單個原子操作B已經完全評估。

+1

外觀極好的答案,這似乎是非常正確的解決方案,+1 –

+0

@lanzz +1,謝謝!我只是應該分割我的數組。 –

1

你的第二個部分使用$配置陣列,當你還在聲明它, 你可以在兩個聲明,像這樣把它分解:

$config['debug']    = array(
     'type'     => array(
      'remote_specific' => true, 
      'remote_addr'  => '1.2.3.4', 
     )); 
$config['debug']['mode']  = array(
     'PHP'     => ($config['debug']['type']['remote_specific'] && $config['debug']['type']['remote_addr'] == $_SERVER['REMOTE_ADDR']) ? true : true, 
     'PDO'     => ($config['debug']['type']['remote_specific'] && $config['debug']['type']['remote_addr'] == $_SERVER['REMOTE_ADDR']) ? true : false 
); 
+0

這就是我要做的事情。謝謝你的例子! –

+0

沒問題,如果這是你可以接受的答案 –

2

這就像在試圖從書架上讀取書籍之前一樣。在PHP中,您無法在定義數組元素之前訪問數組元素。

數組僅在求值完整語句後才被定義,所以當您嘗試在數組內部訪問$config['debug']['type']['remote_specific']時,$config是PHP的未知變量,因此會引發通知。

+0

我明白了,非常感謝您的回答! –