微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP:for循环内的静态变量与for循环外的非静态变量有什么区别?

例如,两者之间有什么区别

$foobar = 0
for ($i=0; $i<20; $i++) {
    //do something using $foobar
    $foobar++;
}

for ($i=0; $i<20; $i++) {
    static $foobar = 0
    //do something using $foobar
    $foobar++;
}

???

以上两个示例的结果均与以下结果不同:

for ($i=0; $i<20; $i++) {
    $foobar = 0
    //do something using $foobar
    $foobar++;
}

这三种变化都有不同的结果.我了解到,在这三个示例中的第一个示例中,$foobar变量的值越来越大,而在第三个示例中,$foobar变量的值在每个循环中都会复位.我不确定使用静态$foobar变量的示例在做什么.在使用$foobar的for循环部分中,前两个示例的行为似乎相同,但对我而言并非如此.

供参考,这是我的实际代码(算法尚未完成).我标记了for()循环,让我考虑了这个主题

function combine($chararr, $k) {

    $currentsize = sizeof($chararr);
    static $combs = array();
    static $originalsize = "unset";
    if ($originalsize === "unset") $originalsize = $currentsize;
    static $firstcall = true;

    if ($originalsize >= $k) {

        $comb = '';
        if ($firstcall === true) { 
            for ($i = $originalsize-$k; $i < $originalsize; $i++) {
                $comb .= $chararr[$i];
            }
            $combs[] = $comb; 
            $firstcall = false; 
        }
        if ($currentsize > $k) { 

            $comb = ''; //reset
            for ($i=0; $i<$k; $i++) { 
                $comb .= $chararr[$i];
            }
            $combs[] = $comb;

            //########### THE FOR LOOP IN QUESTION ###########              
            for ($i = $k-1; $i >= 0; $i--) { 
            static $range_adj = 0;
                for ( $j = $i+1; $j < $currentsize-$range_adj; $j++ ) { 
                    if ( !($i == 0 and $j == $currentsize-$range_adj-1) ) { 
                        $comb = substr_replace($comb, $chararr[$j], $i, 1); 
                        $combs[] = $comb;
                    }
                }
                $range_adj++;
            }
            if ($currentsize-1 > $k) { 
                array_splice($chararr, 0, 1); 
                combine($chararr, $k); 
            }
        }
        $output = array_values( $combs );
        unset($combs);
        return $output;
    }
    else {
        return false;
    }
}

如果我从for循环中删除$range_adj变量并将其作为非静态变量放置在上述for循环之前,那么我的函数结果将是不同的.这是修改后的for循环的样子:

            $range_adj = 0;
            for ($i = $k-1; $i >= 0; $i--) { 
                for ( $j = $i+1; $j < $currentsize-$range_adj; $j++ ) { 
                    if ( !($i == 0 and $j == $currentsize-$range_adj-1) ) { 
                        $comb = substr_replace($comb, $chararr[$j], $i, 1); 
                        $combs[] = $comb;
                    }
                }
                $range_adj++;
            }

我得到两个不同的结果这一事实使我相信每种方法都有一些不同之处,因为如果两种方法产生的结果相同,那么我的函数的结果在两种情况下都将是相同的,而当我测试这些方案.为什么我得到两个结果?使用实现的for循环的两种方法测试我的功能,您还将获得不同的结果.

为了您的方便,这是原始方法

            for ($i = $k-1; $i >= 0; $i--) { 
                static $range_adj = 0;
                for ( $j = $i+1; $j < $currentsize-$range_adj; $j++ ) { 
                    if ( !($i == 0 and $j == $currentsize-$range_adj-1) ) { 
                        $comb = substr_replace($comb, $chararr[$j], $i, 1); 
                        $combs[] = $comb;
                    }
                }
                $range_adj++;
            }

???

在我看来,结果应该完全相同,但事实并非如此.如果运行我的函数,您会注意到for循环的每种方法都会得到不同的结果.

解决方法:

第一和第二循环似乎做同样的事情.这是因为,与其他任何静态初始化的变量一样,静态意味着您只需对其初始化一次.当您尝试再次访问它时,它会保留其值.您会发现,无论您在何处声明/初始化,静态$foobar仍将存在于循环范围之外;这是由于PHP的特性,与static变量无关.

仅当您尝试在循环之前访问$foobar时,这种差异才变得很明显:第二个代码段中尚未声明它,因为您仅在循环中创建它,因此您可能会得到未定义的变量通知.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐