2015-04-27 29 views
1

內部函數定義在第二次考慮到所有這些文件:變量沒有的foreach

vars.php

if($local){ 
    $var = 'var'; 
    $foo = 'foo'; 
    $var1 = 'var1'; 
    $foo1 = 'foo1'; 
}else{ 
    $var = ''; 
    $foo = ''; 
    $var1 = ''; 
    $foo1 = ''; 
} 

/remote/vars.remote.php is the same as vars.php but different values for variables 

cons.php

$local = isset($_SERVER['REMOTE_ADDR']) && ($_SERVER['REMOTE_ADDR'] === '127.0.0.1') ? 1 : 0; 
if ($local){ 
     include_once ('vars.php'); 
}else{ 
     include_once('/remote/vars.remote.php); 
}  
define(CONST_OP_1,$var); 
define(CONST_MAIL_1,$foo); 
define(CONST_OP_2,$var1); 
define(CONST_MAIL_2,$foo1); 

的config.php

require_once "Mail/Queue.php"; 
include_once ('cons.php'); 
$db_options['user'] = CONST_OP_1; 
$db_options['pass'] = CONST_OP_2; 
$mail_options['port'] = CONST_MAIL_1; 
$mail_options['dsn'] = CONST_MAIL_2; 

mail.php

class Sendmail 
    { 
... 
function sendc($var){ 
     require_once ('config.php'); 
     $mail_queue = new Mail_Queue($db_options , $mail_options); 
} 

... 

} 

comm.php

foreach($array_mails as $email){ 
    $mail_q = $sendmail->sendc($u_name); 
} 

也有一些是我不明白,我沒能想通這爲什麼會發生。當我執行comm.phpajax function我傳遞和數組在$array_mails,但對我來說一個奇怪的原因,一切正常工作在第一個循環,但在第二循環(和以下)在foreach似乎config.php文件中的數組似乎不似乎要聲明,所以它給我一個

注意:$ db_options和$ mail_options的未定義變量。

我知道如何解決這個問題,但我想了解爲什麼會發生這種情況。任何人都可以解釋嗎?

+0

我不確定,但是當你替換''時會發生什麼? 1:0'帶'?在設置'$ local'變量值的代碼部分是true:false'? – Maximus2012

回答

1

您需要將require_once('config.php')更改爲require,或者將其置於文件的頂部。

require_once只允許將該文件包含一次,所以它不會在第二個循環中再次包含該文件。

+0

好的,感謝Syfaro,但文檔說http://php.net/manual/en/function.require-once.php「將檢查文件是否已經包含,如果是,不包括(需要)它再次「意思是有一次包含,所以我的變量在那裏一次就足夠了。我是唯一一個懂得這種方式的人嗎? – MikRut

+1

我想象一下,當你需要它時,它只在那個範圍內包含那些值,所以在下一個循環中,它們就會丟失。如果你把它放在文件的頂部,這不會發生。 – ixchi