PHP继承 - 方法和属性

时间:2013-09-12 19:31:22

标签: php inheritance

我显然不能正确理解继承。我会让我的代码进行讨论:

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)和一个抽象方法,(永远不要隐藏数字的连接,方法的实现是出于我的问题的范围)将访问那里的属性。

然后,具体类扩展了抽象类。如您所见,我可以成功访问属性并设置它们,但是当我调用添加数字时,看起来好像没有设置属性。

发生了什么,为什么这不起作用,我该如何解决? 我可以在具体类中定义一个添加数字的方法,但我希望在抽象类中有一个方法可以重用。

谢谢!

2 个答案:

答案 0 :(得分:4)

抽象类中的两个属性是私有的,这意味着它们不存在并且在任何扩展此类的类中都是已知的。

因此MyCalc不会写入这些属性,也无法在AddNumbers函数中读取它们。 MyCalc构造函数实际上创建了新的公共属性。

使属性“受保护”,它将起作用。

答案 1 :(得分:2)

private关键字定义只有Calc中的方法才能修改这些变量。如果您希望其任何子类中的Calc 方法中的方法访问这些变量,请改用protected关键字。

您可以访问$this->x,因为PHP会让您在对象上创建成员变量而不会声明它。执行此操作时,生成的成员变量将隐式声明为public,但它与private中定义的Calc变量无关,myCalc不在{{1}}的范围内。