首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在重复调用PHP方法时递增计数器变量

在重复调用PHP方法时递增计数器变量
EN

Stack Overflow用户
提问于 2012-09-02 23:44:44
回答 3查看 3.2K关注 0票数 3
代码语言:javascript
复制
<html>
//index.php

<form action="" method="post"> 
  <label for="item">Item: </label>
    <select name="item">
        <option value="fruit tea">Fruit Tea</option>
         <option value="strawberries">Strawberries</option>
         <option value="coffee">Coffee</option>
    </select><br />

    <label for="qty">Qty: </label>
        <input type="text" name="qty" />
        <input type="submit" name="submit" value="submit" />
</form>


<?php

    @$qty = $_POST['qty'];
    @$item = $_POST['item'];

    $co = new Checkout( $pricing_rules );
    print $co->scan( $item ). ' has been scanned '.$co->increment(). ' times';

?>
</html>




<?php

/**
* Description of Checkout
*
* @author cookie
*/
class Checkout {

private $pricing_rules = array();
private $pcode;
public $item;


public function __construct( array $pricing_rules ) {
    $this->pricing_rules = $pricing_rules;
}

public function scan( $item ) {

    $this->increment();
    return $item;
}

private function prod_code( $pcode ) {

    $this->pcode = $pcode;
}


public function increment() {
    static $count = 0;
    $count++;
    return $count;
}

public function total() {

}


}

?>

它应该做的是...

如果我单击submit按钮四次,比如从下拉列表中选择了草莓。该脚本应打印到屏幕上:

草莓已被扫描%1次

草莓已被扫描2次

草莓已经被扫描了3次

草莓已经被扫描了4次

等等……

其中$count跟踪递增。

它实际做的是:

它打印:

无论我按多少次submit,草莓都被扫描了2次。并止步于此。我遗漏了一些东西。

我知道它在做什么了--在页面加载时,通过这行代码调用increment()两次:

代码语言:javascript
复制
print $co->scan( $item ). ' has been scanned '.$co->increment(). ' times';

我试过了:

代码语言:javascript
复制
  if($_SERVER['REQUEST_METHOD'] == 'POST') $co->increment();

此外,这会使$count递增1,但到此为止。我有点纠结于这个..

帮助

EN

回答 3

Stack Overflow用户

发布于 2012-09-02 23:49:23

static变量对于当前脚本执行只是静态的。您的变量会在每次页面重新加载时丢失(当您提交它时)。为此,您需要将其存储在$_SESSION中。实际上,这里有一个与您在$_SESSION basic usage manual.上尝试的非常相似的示例

代码语言:javascript
复制
// Call session_start() at the beginning of your script...
session_start();

// And modify your method to store count in the $_SESSION.
public function increment() {
    // initialize it if not already initialized
    $_SESSION['count'] = !isset($_SESSION['count']) ? 0 : $_SESSION['count'];
    $_SESSION['count']++;
    return $_SESSION['count'];
}
票数 2
EN

Stack Overflow用户

发布于 2012-09-02 23:52:46

每次提交表单时,它都会向服务器发出一个新的HTTP请求,脚本会重新运行。变量从一次运行到下一次运行时不会保留它们的值。

如果您希望在页面重新加载时保存变量,则需要按照Michael Berkowski的建议使用会话变量。但是,这只是在浏览器会话中实现的。如果您需要更长的保留期,您可以使用cookies,但用户可以删除它们。最后,如果你想要真正的永久内存,你可以使用数据库。

如果您需要组合来自多个用户的数据,则该数据库也是合适的。例如,如果用户A扫描了一个项目,然后用户B扫描了该项目,而您希望显示合并后的合计。

票数 1
EN

Stack Overflow用户

发布于 2012-09-03 00:06:30

除了Michael Berkowski的回答之外,我还想指出一些其他的东西。如果函数应该是一个对象字段,为什么还要在函数中声明$counter呢?既然它应该是一个对象场,那么为什么是static呢?如果它是静态的,它将计入给定时间点的所有Checkout实例。

您还可以在scan()内部调用一次increment(),然后再次调用它

代码语言:javascript
复制
print $co->scan( $item ). ' has been scanned '.$co->increment(). ' times';
//         ^ here $counter == 1                       ^ and here $counter == 2

添加

这样的事情对我来说更有意义

代码语言:javascript
复制
class Checkout{

    private $counter;


    public __construct(){
        $this->counter = 0;
        // ......
    }
    // ..... 

    public function scan(){
        // ....
        $this->counter++;
    }

    public function getCounter(){
        $return $this->counter;
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12237334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档