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
相关产品推荐
相关产品推荐

