PHP for;变量范围

时间:2016-01-06 16:10:20

标签: php loops variables 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 =&#34; mainNav处于活动状态&#34; 如果该页面是 class =&#34; mainNav&#34; < / strong>如果没有。

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!

所以我从@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> 

仍然没有,现在我似乎已经丢失了回声语句的输出......

2 个答案:

答案 0 :(得分:5)

  

for / foreach循环中的变量是否具有局部范围?如果是这样,我如何使其全球化?

PHP中只有两种范围:全局范围和本地函数范围。

本地函数作用域包含函数的参数以及函数体内设置的变量。范围是在调用函数时创建的,并且在函数执行完成时(在执行return语句之后或在最后一个语句之后达到其结束}时)将被销毁。 / p>

全局范围包含由任何函数外部的代码设置的所有变量。它由主脚本(由解释器调用的脚本)创建。

includedrequired文件不会创建新范围。包含文件中的函数外部的代码在放置includerequire语句的范围内运行。这意味着,如果include语句出现在包含include语句的函数的本地范围的任何函数之外,则为全局范围。所有四个包含语句(includeinclude_oncerequirerequire_once)在此事项上的工作方式相同。

任何变量在其范围内都可用,因为它是第一次设置,直到使用unset()删除它或直到其范围被销毁。

详细了解variables scope上的PHP documentation

回答你的问题:如果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的值。 $active的最后一项任务除了else之外都没用。只有最后一个才算。而且,最有可能的是,在最后一次迭代中,if ($title == $value)的{​​{1}}分支和$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

答案 1 :(得分:-1)

您的代码应该看起来像

$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

了解有关scope

的更多信息