<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()两次:
print $co->scan( $item ). ' has been scanned '.$co->increment(). ' times';我试过了:
if($_SERVER['REQUEST_METHOD'] == 'POST') $co->increment();此外,这会使$count递增1,但到此为止。我有点纠结于这个..
帮助
发布于 2012-09-02 23:49:23
static变量对于当前脚本执行只是静态的。您的变量会在每次页面重新加载时丢失(当您提交它时)。为此,您需要将其存储在$_SESSION中。实际上,这里有一个与您在$_SESSION basic usage manual.上尝试的非常相似的示例
// 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'];
}发布于 2012-09-02 23:52:46
每次提交表单时,它都会向服务器发出一个新的HTTP请求,脚本会重新运行。变量从一次运行到下一次运行时不会保留它们的值。
如果您希望在页面重新加载时保存变量,则需要按照Michael Berkowski的建议使用会话变量。但是,这只是在浏览器会话中实现的。如果您需要更长的保留期,您可以使用cookies,但用户可以删除它们。最后,如果你想要真正的永久内存,你可以使用数据库。
如果您需要组合来自多个用户的数据,则该数据库也是合适的。例如,如果用户A扫描了一个项目,然后用户B扫描了该项目,而您希望显示合并后的合计。
发布于 2012-09-03 00:06:30
除了Michael Berkowski的回答之外,我还想指出一些其他的东西。如果函数应该是一个对象字段,为什么还要在函数中声明$counter呢?既然它应该是一个对象场,那么为什么是static呢?如果它是静态的,它将计入给定时间点的所有Checkout实例。
您还可以在scan()内部调用一次increment(),然后再次调用它
print $co->scan( $item ). ' has been scanned '.$co->increment(). ' times';
// ^ here $counter == 1 ^ and here $counter == 2添加
这样的事情对我来说更有意义
class Checkout{
private $counter;
public __construct(){
$this->counter = 0;
// ......
}
// .....
public function scan(){
// ....
$this->counter++;
}
public function getCounter(){
$return $this->counter;
}
}https://stackoverflow.com/questions/12237334
复制相似问题