我显然不能正确理解继承。我会让我的代码进行讨论:
abstract class Calc {
private $x;
private $y;
public function AddNumbers() {
echo $this->x. " + " .$this->y;
}
}
class myCalc extends Calc {
public function __construct ($x,$y) {
$this->x = $x;
$this->y = $y;
}
}
$calc1 = new myCalc(3,4);
$calc1->AddNumbers();
echo 'done';
exit;
好的,那么这里发生了什么:我想要一个抽象类,它将定义两个属性(x和y)和一个抽象方法,(永远不要隐藏数字的连接,方法的实现是出于我的问题的范围)将访问那里的属性。
然后,具体类扩展了抽象类。如您所见,我可以成功访问属性并设置它们,但是当我调用添加数字时,看起来好像没有设置属性。
发生了什么,为什么这不起作用,我该如何解决? 我可以在具体类中定义一个添加数字的方法,但我希望在抽象类中有一个方法可以重用。
谢谢!
答案 0 :(得分:4)
抽象类中的两个属性是私有的,这意味着它们不存在并且在任何扩展此类的类中都是已知的。
因此MyCalc
不会写入这些属性,也无法在AddNumbers
函数中读取它们。 MyCalc
构造函数实际上创建了新的公共属性。
使属性“受保护”,它将起作用。
答案 1 :(得分:2)
private
关键字定义只有Calc
中的方法才能修改这些变量。如果您希望其任何子类中的Calc
和方法中的方法访问这些变量,请改用protected
关键字。
您可以访问$this->x
,因为PHP会让您在对象上创建成员变量而不会声明它。执行此操作时,生成的成员变量将隐式声明为public
,但它与private
中定义的Calc
变量无关,myCalc
不在{{1}}的范围内。