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

PHP扩展类与未定义变量问题:继承抽象类的图形类代码分析

分析与修复:PHP继承类中的未定义变量问题

让我来帮你拆解这段代码里的未定义变量问题,核心原因其实是没有正确访问类的成员属性,咱们一步步梳理:

问题根源

在PHP中,要访问类内部的成员属性,必须通过$this->属性名的方式。如果直接写变量名(比如$side),PHP会把它当成当前函数作用域里的局部变量,而你在构造函数和Area()方法里都没有定义过这些局部变量,自然就会触发“未定义变量”的错误。

1. Square类的问题

  • 构造函数里:$side = $n; 只是创建了一个局部变量$side,并没有给类的私有属性$this->side赋值
  • Area()方法里:echo $side * $side; 试图访问不存在的局部变量$side,而非类的属性

2. Rectangle类的问题

和Square类完全一致:

  • 构造函数里的$length = $a;、$width = $b;都是操作局部变量,没有给类的成员属性赋值
  • 未完成的Area()方法如果直接用$length和$width,同样会触发未定义变量错误

修复后的完整代码

abstract class ShapesClass { // 强制子类定义该方法
    abstract public function Area();
}

class Square extends ShapesClass {
    private $side = 0;
    
    function __construct($n) {
        $this->side = $n; // 正确访问类的私有属性
    }
    
    function Area() {
        echo $this->side * $this->side; // 正确访问类的私有属性
    }
}

class Rectangle extends ShapesClass {
    public $length = 0;
    public $width = 0;
    
    function __construct($a,$b) {
        $this->length = $a; // 正确访问类的成员属性
        $this->width = $b; // 正确访问类的成员属性
    }
    
    function Area() {
        echo $this->length * $this->width; // 正确访问类的成员属性
    }
}

补充一点:虽然PHP里var关键字可以用来声明类属性,但更推荐用public/protected/private来明确属性的访问权限,让代码更规范哦。

内容的提问来源于stack exchange,提问作者Shorn Jacob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:29:00