类继承 - 调用不在父类中的属性和/或方法

时间:2013-07-23 17:57:38

标签: php class oop inheritance

我正在尝试理解类继承。

假设我有以下代码(PHP):

class A {
     public function fire() {
        echo "Fire!";
     } 
}

class B extends A {
     public function water() {
        echo "Water!";
     }
}

class C extends B {
     public function lightning() {
         echo "Lightning!";
     }
}

$cObject = new C();

$cObject->fire();  

我的问题是

  • 即使没有在C类和B类中定义fire()方法,$ cObject-> fire()也可以。 C类不仅继承了B类的方法,还继承了A类的方法吗?我试图找出深度继承有多少级别。
  • 是否存在调用当前对象实例中不存在的属性或方法的术语,但此属性或方法是否存在于父类或祖先类中?编辑:换句话说,fire()没有在C类中定义,但$ cObject仍然可以调用fire()。这个概念有没有特定的术语/术语? (或者它只是“类继承”定义的一部分)

2 个答案:

答案 0 :(得分:2)

  

我正在试图找出深度继承的级别。

如果你愿意的话,不可思议。没有限制

  

是否存在调用当前对象实例中不存在的属性或方法的术语,但此属性或方法是否存在于父类或祖先类中?

对于类变量:no。 对于类方法:yes。将它们声明为private

class A {
    private function test() {
        echo 'test';
    }
}

class B extends A {
    public function __construct() {
        $this->test();
    }
}

$b = new B();

输出:

Fatal error: Call to private method A::test() from context 'B' in /home/thorsten/a.php on line 14

答案 1 :(得分:1)

1)“B”类是“A”。 “C”类是“B”,因此“C”是“A”。 “B”在“A”,“C”中拥有权利和特权的一切也都有。 C ++有一个私有继承的概念,这里有点时髦,但这是一般的想法。正如在另一个答案中所说,继承将在链被定义的范围内进行。

2)我认为你的意思是问“什么是一个被称为的函数未在派生类中定义,而是在基类中定义。这种类型的函数称为虚函数。据我所知,PHP中的每个类函数都是一个虚函数,可以重写(在派生类中重新实现),除非它被声明为 final