我们的项目中有一个类似于以下内容的视图
<?php
static $counter = 0;
$counter++
?>
<div id="item_<?= $counter ?>"> Item <?= $counter ?> </div>
每个请求都会多次调用该视图,但计数器值似乎总是为1。
这种行为与函数内静态变量的记录行为有些不同,但我找不到函数或类之外的任何关于静态变量的文档。
这里发生了什么事?为什么这个模式在函数内部工作,而不在外部工作?静态关键字在这个范围中有值吗?
*https://www.php.net/manual/en/language.variables.scope.php#language.variables.scope.static
更新
关于进一步的调查,并跟随一些答案..。
我认为视图实际上是在主脚本中一个又一个地“内联”,所以它的作用域与一个函数声明一次,然后多次调用的方式不同。
如果我在同一个函数中重复声明和递增两次静态计数器,我就会期望相同的非递增行为。
因此,我的猜测是,函数之外的静态变量并不完全是“错误的”,但是没有一个有效的用例。
发布于 2021-01-11 07:23:45
static
只适用于函数:
静态变量只存在于本地函数作用域中,但当程序执行离开此作用域时,它不会丢失其值。
毫无疑问,有更好的方法基于应用程序结构和如何调用视图等等。但是,由于这是一个脚本的单个执行,但视图文件的多个包含,所以您可以使用一个全局变量:
$GLOBALS['counter'] = ++$GLOBALS['counter'] ?? 0;
$counter = $GLOBALS['counter'];
如果设置了$GLOBALS['counter']
,那么它将被递增,如果没有,它将被设置为0,然后分配给$counter
。
对于PHP < 7.0.0:
$GLOBALS['counter'] = isset($GLOBALS['counter']) ? ++$GLOBALS['counter'] : 0;
$counter = $GLOBALS['counter'];
发布于 2021-01-11 07:15:04
如果您的div处于循环中(例如,foreach),您可以这样增加计数器:
<?php
$counter = 0;
foreach ($items as $item) {
$counter++;
echo <div id="item_<?= $counter ?>"> Item <?= $counter ?> </div>
}
?>
发布于 2021-01-11 07:30:14
因为您的$counter
位于主脚本中(该文件中的代码),您的主脚本将执行一次,然后您的$counter
将被销毁。
如果您的$counter
在该函数中,则将增加每个调用的函数的$counter
。
https://stackoverflow.com/questions/65669339
复制