2010-11-05 44 views
13

好吧我似乎对PHP的变量作用域有个误解,原谅我缺乏这个主题,因为我来自Java,C#背景。思考我可以使变量可以被函数访问,或者如果声明简单地放在函数之外。下面是什么,我试图完成一个片段:if语句的变量作用域问题(PHP)

foreach ($nm as $row=>$im) { 
    $itm_name = $im; 
    $lnk = $lnk_cty[$row]; 
    if($mode == 'addMenu') { 
     $m = $m_id; //id will be coming from fresh insert of menu_name 
    } else { 
     $m = $_POST['mnu_add'][$row]; 
     echo "MENU_ID: ".$m; 
    } 
    if($mode == 'addCat') { 
     $m = $c_id; //id will be coming from fresh insert of cat_name 
    } else { 
$m = $_POST['cat_add'][$row]; 
    } 
    //used for testing purposes 
    echo "item name: ".$itm_name ."<br />"; 
    echo "lnk: ".$lnk ."<br />"; 
    echo "m: ".$m ."<br />"; //$m is empty here, because its a new declaration as oppose to accessing $m value from if statement 
    $display_fields .= "<li>".$itm_name." ".$item."</li>"; 
    $sql_array[] = '("' . $itm_name . '", "' . $lnk . '", ' . $m . ')'; // Add a new entry to the queue 
} 

现在我想要做的是使$m变量值外部访问的if语句其在$sql_array[]语句中使用的$m变量。在C#中,我只需在foreach循环外部声明一个变量并能够使用它。在对这个问题进行一些阅读之后,我发现使用全局或GLOBALS关键字只有在我的全局范围变量在foreach之前赋值时声明global $m才能在循环中获取该值。但是用我现在的代码$m在if语句中是一个局部范围,每个人都不鼓励使用它们。现在有没有更好的方法可以使$m访问$sql_array[]声明?

+0

这是什么意思:'id *会*来了吗?' – 2010-11-05 22:01:02

+0

ID的来源将是... – 2010-11-05 22:04:53

+0

@ Aurel300谢谢你先生。翻译。你能告诉运行时的实际$ m_id值吗? – 2010-11-05 22:10:59

回答

54

If语句块没有自己的范围。无论您分配给$m的数据必须为空,才能开始。尝试调试诸如$_POST变量之类的东西。另外,$m_id的定义在哪里?也许它也是空的。

PHP 确实在函数,类方法等内部具有作用域。但if语句没有自己的范围。例如,下面的代码将回声Hi there!

$bool = true; 
if ($bool) { 
    $new_var = 'Hi there!'; 
} 
echo $new_var; 

已经在manual读。

+0

他试图说当你在一个if语句中放置一个var声明时,该变量将不再可用。 – 2010-11-05 21:56:53

+2

我知道他在说什么,但在PHP中这不是真的。 – Stephen 2010-11-05 21:58:28

+0

是的。对不起有点失败:D – 2010-11-05 22:00:29

-1

它的确如此,如果语句没有范围,但似乎有一个范围(大括号中的一段代码)的问题..在下面的代码片段预期的结果是:$ z [0] = 0,$ z [1] = 1,但获得的实际输出为$ z [0] = 100;和$ z [1]是未定义的。使用的PHP是Apache友分布

<?php 

$x = 0; 
$y = 1; 
$z[0]=100; 

if($x!=0){ 
    $z[0]=1; 
    $z[1]=2; 
    $z[2]=3; 
    $z[3]=4; 
}else{ 
    if($y == 0){ 
     $a =1; 
    }else{ 
     global $z; 
     echo $z[0]; 
     echo $z[1]; 
    } 
} 

?> 
+0

我编辑了你的代码,现在它是正确的。 +1 – 2017-10-09 10:12:35

1

这里的变量$ id_struct没有设置,我该怎么办?

if(!$struct_req) { 
       mysql_query("insert into structure values (null, 3,'".$_POST["structure"]."')") or die("insert structure : ". mysql_error()); 
       if(isset($id_struct)) echo "isset <br>"; 
       $id_struct = mysql_insert_id(); 
}else { 
       //global $id_struct; 
       $id_struct = mysql_fetch_array($struct_req)["id_structure"]; 

} 
echo $id_struct;