PHP for;foreach变量范围


PHP for ; foreach variable scope

for/foreach循环中的变量是否具有局部作用域?如果是,我如何使其全球化?

page.php:

<?php
$title = "2";                  
$menu[0] = "1";   
$menu[1] = "2";
$menu[2] = "3";
$menu[3] = "4";
$menu[4] = "5";
$menu[5] = "6";
$menu[6] = "7";
$menu[7] = "8";

foreach ($menu as $value){ 
if ($title == $value){   
       $active = "active";
       echo "if " . $active. $title . $menu[$x] ." <br /><br />";
} 
else {
     $active = "";
     echo "else " . $active. $title . $menu[$x] ." <br /><br />";
}}
include "header.php"; 
foreach ($menu as $value) {
var_dump($active);
    echo "$value <br>";
}

include "header.php"; 
?>
<!-- begin page content -->
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<!-- end page content -->
<?php
include "footer.php";                
?>

本质上,我在header.php中有这样一行:

<li class="mainNav <?php echo $active; ?>" style="z-index:8">
<a href="http://www.com"><?php echo $menu[0]; ?></a></li>

如果是该页面,我希望列表具有class="mainNav active",如果不是,则具有class="mainNav"

所以我从@urfusion建议创建了一个函数。现在page.php:

<?php
$title = "2";                  
$menu[0] = "1";   
$menu[1] = "2";
$menu[2] = "3";
$menu[3] = "4";
$menu[4] = "5";
$menu[5] = "6";
$menu[6] = "7";
$menu[7] = "8;
?>

<?php

function mainNav($menu) {

foreach ($menu as $value){ 
 if ($title == $value){   
       $active = "active";
       echo "if " . $active. $title . $menu[$x] . " <br /><br />";
   } 
   else {
     $active = " ";
     echo "else " . $active. $title . $menu[$x] . " <br /><br />";
    }  

echo "function" . $active . $value;
  return $active;
}
}

include "header.php"; 
?>

<!-- begin page content -->
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
<!-- end page content -->
<?php
include "footer.php";                
?>

和header.php:

 <li class="mainNav <?php mainNav(); ?>" style="z-index:8">
<a href="http://www.com"><?php echo $menu[1]; ?></a></li> 

仍然什么都没有,现在我似乎失去了回声语句的输出。。。

for/foreach循环中的变量是否具有局部作用域?如果是,我如何使其全球化?

PHP中只有两种作用域:全局作用域和本地函数作用域。

局部函数作用域包含函数的参数和在函数体内部设置的变量。作用域在调用函数时创建,在函数执行完成时销毁。

全局作用域包含由任何函数外的代码设置的所有变量。它是在主脚本(解释器调用的脚本)启动时创建的。

include d和require d文件不会创建新的作用域。所包含文件中函数外部的代码在放置includerequire语句的作用域中运行。这意味着,如果include语句出现在包含include语句的函数的本地作用域的任何函数之外,则为全局作用域。所有四个包含语句(includeinclude_oncerequirerequire_once)在这一问题上都起着相同的作用。

任何变量在其作用域中都是可用的,因为它是第一次设置的,直到使用unset()删除它,或者直到它的作用域被破坏。

在PHP文档中阅读有关variables scope的更多信息。


为了回答您的问题:如果forforeach循环被放置在函数中,那么它们定义的变量具有局部作用域(函数的作用域);否则,它们具有全球范围。


代码中的问题(错误的缩进并不能帮助您看到它)出现在第一个foreach中。

这是正确缩进的代码:

foreach ($menu as $value) {
    if ($title == $value) {
        $active = "active";
        echo "if " . $active. $title . $menu[$x] ." <br /><br />";
    } else {
        $active = "";
        echo "else " . $active. $title . $menu[$x] ." <br /><br />";
    }
}

问题是显而易见的:它在每次迭代中都会修改变量$active的值。除了CCD_ 17的最后一个赋值之外,所有赋值都是无用的。只有最后一个才算数。最有可能的是,在最后一次迭代中,它取if ($title == $value)else分支,$active变为''(空字符串)。

这个问题有几种简单的解决办法。例如,您可以在上述foreach:中显示菜单

foreach ($menu as $value) {
    if ($title == $value) {
        $active = "active";
    } else {
        $active = "";
    }
    ?>
    <li class="mainNav <?php echo $active; ?>" style="z-index:8">
    <a href="http://www.com"><?php echo $value; ?></a></li>
    <?php
}

事实上,所有这些东西都应该进入header.php

您的代码应该看起来像

$active = "";
foreach ($menu as $value){ 
   if ($title == $value){   
       $active = "active";
       echo "if " . $active. $title . $menu[$x] ." <br /><br />";
   } 
   else {
     $active = "";
     echo "else " . $active. $title . $menu[$x] ." <br /><br />";
   }
}

在PHP中,变量可以在脚本中的任何位置声明。

变量的作用域是脚本中可以引用/使用变量的部分。

PHP有三个不同的变量范围:

local
global
static

有关作用域的更多信息