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。
几乎可以肯定有更好的方法来实现您正在尝试做的事情,但是同样,关于如何视图生成的更多上下文将有助于指导更有用的答案.
我们的项目中有一个看起来像这样的视图
<?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。
几乎可以肯定有更好的方法来实现您正在尝试做的事情,但是同样,关于如何视图生成的更多上下文将有助于指导更有用的答案.