PHP 静态计数器变量(不在函数中)

PHP static counter variable (not in function)

我们的项目中有一个看起来像这样的视图

<?php
static $counter = 0;
$counter++
?>
<div id="item_<?= $counter ?>"> Item <?= $counter ?> </div>

每个请求多次调用视图,但计数器值似乎始终为 1

此行为与函数内静态变量记录的行为有些不同*,但我找不到任何关于函数外静态变量的文档或 类

这里发生了什么?为什么这种模式在函数内起作用,但在函数外不起作用? static 关键字在此范围内是否有任何值?

*https://www.php.net/manual/en/language.variables.scope.php#language.variables.scope.static


更新

进一步调查,并遵循一些答案..

我认为视图在主脚本中实际上是一个接一个地 'inlined',因此它们的作用域与声明一次然后调用多次的函数不同

如果我在同一个函数中重复声明和递增静态计数器两次,我会期望相同的非递增行为

所以我的猜测是函数外部的静态变量不完全是 'wrong',但没有有效的用例

如果您的 div 处于循环中(例如 foreach),您可以像这样增加计数器:

<?php 
    
$counter = 0;
    
foreach ($items as $item) {
    $counter++;
    echo <div id="item_<?= $counter ?>"> Item <?= $counter ?> </div>
}

?>

static 仅用于函数:

A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope.

根据应用程序结构和调用视图的方式等,无疑有更好的方法。但是由于这是脚本的单次执行但包含视图文件的多次包含,您可以使用全局变量:

$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'];

因为你的$counter在主脚本中(那个文件里的代码),你的主脚本会执行一次,然后你的$counter就会被销毁。

如果你的$counter在函数中,$counter将在每次函数调用时增加。

每次生成视图时,您的 $counter 都会重置为 0,因此它一定超出了范围。如果没有关于如何生成视图的更多上下文,很难说为什么,但也许每次生成视图时,它都是在它自己的 class?

实例中完成的

一种方法是在全局范围内初始化 $counter,并在生成视图时使用它

例如:

<?php

$counter=0;

function generateView(){      //<--- Whatever function being used to generate the view
  global $counter;
  $counter++;
  echo '<div id="item_'.$counter.'"> Item '.$counter.' </div>';
}

generateView(); //Generated the first time
generateView(); //Generated a second time

?>

(实际上,如果此 您的代码,则在函数内部使用 static $counter=0 会按预期工作,但这只是 global变量可以使用)

此方法不推荐,因为全局变量可能会造成混淆,导致意外结果,通常应避免使用 IMO。

几乎可以肯定有更好的方法来实现您正在尝试做的事情,但是同样,关于如何视图生成的更多上下文将有助于指导更有用的答案.