我希望一个元素出现在循环中,但只出现在某些点上。我可以直接在模板文件中提供条件(以“标志”的形式,在条件满足时设置,防止进一步的迭代),它可以工作,但当我通过函数生成相同的逻辑时,标志似乎没有设置。
换句话说,提供一个简化的(最简单的!)案例-以下工程-案例1:
while( have_posts() ) : the_post();
if ( $flag < 1 ) {
echo \'Flag worked!\';
$flag = 1;
}
/* all of the code producing a post */
endwhile;
以上工作如预期:“标志工作!”
出现一次,再也不会出现。
然而,如果——案例2——我像这样编写了一个函数,并将其添加到主题函数中。php。。。
function flag_it() {
if ( $flag < 1 ) {
echo \'Flag worked!\';
$flag = 1;
}
}
。。。然后将其放置在与第一个代码完全相同的位置,如下所示:
while( have_posts() ) : the_post();
flag_it();
/* all of the code producing a post */
endwhile;
“Flag worked”一词变成了谎言,出现在循环中的每个帖子之前。换言之,if条件不会评估$标志值,或者$标志值继续被视为NULL(因此,“$标志<;1”保持为true)。
我已经尝试过这个主题的各种变体,包括TRUE v FALSE、返回变量、声明为0的值等等,但都不起作用,或者,如果起作用的话!,将回答一个基本问题:为什么案例1有效,而案例2无效,是否有任何方法可以使案例2或类似它的标记条件通过函数工作提供?
最合适的回答,由SO网友:kovshenin 整理而成
问题是每当你打电话flag_it()
没有$flag
可用,所以它总是会导致“标志工作”。尝试改用静态变量:
function flag_it() {
static $flag;
if ( isset( $flag ) )
return;
$flag = true;
echo \'Flag worked!\';
}
请注意,无论您在一次运行中调用此函数多少次,它总是只回显一次。如果要重置计数器,需要将其更改为接受某种类型的
$reset
论点
您可以在此处阅读有关PHP中变量作用域的更多信息:http://php.net/manual/en/language.variables.scope.php