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: 和header.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";
?>
<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文件不会创建新的作用域。所包含文件中函数外部的代码在放置include
或require
语句的作用域中运行。这意味着,如果include
语句出现在包含include
语句的函数的本地作用域的任何函数之外,则为全局作用域。所有四个包含语句(include
、include_once
、require
、require_once
)在这一问题上都起着相同的作用。
任何变量在其作用域中都是可用的,因为它是第一次设置的,直到使用unset()
删除它,或者直到它的作用域被破坏。
在PHP文档中阅读有关variables scope
的更多信息。
为了回答您的问题:如果for
或foreach
循环被放置在函数中,那么它们定义的变量具有局部作用域(函数的作用域);否则,它们具有全球范围。
代码中的问题(错误的缩进并不能帮助您看到它)出现在第一个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
有关作用域的更多信息