2015-04-27 31 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