You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:27:31