【问题标题】:PHP for ; foreach variable scopePHP 用于 ; foreach 变量范围
【发布时间】:2016-01-06 16:10:20
【问题描述】:

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> 

仍然没有,现在我似乎丢失了 echo 语句的输出...

【问题讨论】:

  • foreach循环之前初始化$active
  • "for / foreach 循环中的变量是否有局部作用域?" - 循环、开关/案例、try-catch 块等不构成 php 中的范围。见3v4l.org/WjX5Q
  • 我不确定您要做什么。第二个 foreach 完全让我失望!
  • 您确定$title 是一个全局变量,例如,可以在您的方法中使用吗?在我看来,您应该在函数声明中使用像 using (...) 这样的子句

标签: php loops variables scope


【解决方案1】:

for / foreach 循环中的变量是否具有本地范围?如果是这样,我如何使它成为全球性的?

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

本地函数作用域包含函数的参数和设置在函数体内的变量。作用域在函数被调用时创建,在函数执行完成时被销毁(在它执行 return 语句之后或在最后一条语句之后到达其关闭 } 时)。

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

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

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

PHP documentation 上阅读有关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 的值。除了$active 的最后一个分配之外,所有的都是无用的。只有最后一个重要。而且,最有可能的是,在最后一次迭代中,if ($title == $value)$activeelse 分支变为 ''(空字符串)。

这个问题有几个简单的解决方案。比如你可以在前面提到的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

【讨论】:

    【解决方案2】:

    你的代码应该是这样的

    $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的信息

    【讨论】:

    • 我得到了正确的回显语句,但它没有改变 header.php。我想知道这是否是因为 foreach 循环不包含在 header.php 文档中,或者它是否是其他东西......
    • 如果不通过任何functionurlsession 变量,您将无法使用其他文件中的变量。
    • 在包含 header.php 时(循环之后),仅保留分配给 $active 的最后一个值。在您的示例中,最后一个分配是在循环迭代中具有$value==8$active=''
    • “如果不通过任何函数或 url 或会话变量传递它,就不能在其他文件中使用变量” - 什么? docs.php.net/manual/en/language.variables.scope.php 另有说法:“在大多数情况下,所有 PHP 变量只有一个范围。这个单一范围也涵盖包含和必需的文件。”
    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 2018-08-05
    • 1970-01-01
    • 2023-03-24
    • 2010-12-19
    • 1970-01-01
    • 2016-01-14
    相关资源
    最近更新 更多