PHP类实现按钮点击计数功能失效问题排查
问题分析:按钮点击计数失效,总是进入else分支
我帮你定位到了两个关键问题,正是它们导致计数功能无法正常工作,每次点击按钮都会进入else分支显示数值为0:
1. 构造函数中的变量引用错误(核心问题)
你在给类的私有属性赋值时,错误使用了变量变量的语法(多写了一个$):
// 错误写法 $this->$toyotalkm = $_POST['toyotalkm']; $this->$nissanlkm = $_POST['nissanlkm']; $this->$painike = $_POST['painike'];
这里的$this->$toyotalkm会被PHP解析为「取变量$toyotalkm的值作为属性名」,但你并没有定义这个变量,相当于给一个不存在的属性赋值,而类原本的$this->toyotalkm等私有属性根本没被正确赋值。
正确的写法是去掉属性名前的额外$:
// 正确写法 $this->toyotalkm = $_POST['toyotalkm']; $this->nissanlkm = $_POST['nissanlkm']; $this->painike = $_POST['painike'];
2. 未处理页面首次加载时的$_POST为空场景
当页面第一次打开时,$_POST数组是空的,直接访问$_POST['toyotalkm']会触发「未定义索引」的警告,同时属性会被赋值为null,导致后续laskeLkm()里的条件判断全部不成立,最终进入else分支把计数重置为0。
你需要在构造函数里给属性设置默认值,处理首次加载的情况:
public function __construct(){ // 使用??运算符处理POST为空的情况,默认值设为0 $this->toyotalkm = $_POST['toyotalkm'] ?? 0; $this->nissanlkm = $_POST['nissanlkm'] ?? 0; $this->painike = $_POST['painike'] ?? ''; }
修正后的完整类代码
<?php class Autolaskuri { private $toyotalkm; private $nissanlkm; private $painike; public function __construct(){ // 修复变量引用,同时处理首次加载的默认值 $this->toyotalkm = $_POST['toyotalkm'] ?? 0; $this->nissanlkm = $_POST['nissanlkm'] ?? 0; $this->painike = $_POST['painike'] ?? ''; } public function laskeLkm(){ if($this->painike == 'Nissan'){ $this->nissanlkm = $this->nissanlkm + 1; } elseif($this->painike == 'Toyota'){ $this->toyotalkm = $this->toyotalkm + 1; } else { $this->nissanlkm = 0; $this->toyotalkm = 0; } } public function teeLomake() { $lomake = <<<EOL <form method="post" action="{$_SERVER['PHP_SELF']}"> <input type="hidden" value="{$this->toyotalkm}" name="toyotalkm"> <input type="hidden" value="{$this->nissanlkm}" name="nissanlkm"> <input type="submit" value="Toyota" name="painike"> <input type="submit" value="Nissan" name="painike"> <input type="submit" value="Nollaa" name="painike"> </form> EOL; echo $lomake; } public function naytaTulokset(){ echo "<br>"; echo "Number of Nissans: {$this->nissanlkm} "; echo "<br>"; echo "Number of Toyotas: {$this->toyotalkm}"; echo "<br>"; } } ?>
额外调试建议
- 开发环境下建议开启PHP错误提示,能快速发现「未定义索引」「未定义变量」这类问题,在代码开头添加:
error_reporting(E_ALL); ini_set('display_errors', 1);
$_SERVER['PHP_SELF']存在XSS风险,建议转义后使用:htmlspecialchars($_SERVER['PHP_SELF'])
内容的提问来源于stack exchange,提问作者Didzis Zvaigzne
相关产品推荐
相关产品推荐

