2017-04-03 67 views
-1

说,例如我有两个类AB类属性是否在扩展类上被覆盖?

答:

class A { 
    private $name = "Joe"; 
} 

B:

class B extends A { 
     private $name = "Scotto"; 
} 

会有什么的$name的价值是什么?它是否覆盖父类属性,或者它会在实例中被实例化吗?任何帮助将是伟大的,谢谢!

+0

@naththedeveloper我可以很容易地尝试,但我正在寻找一个更深入的答案不仅仅是“哇,好,这就是它” –

+0

为什么会被替换?私有意味着只有这个类可以访问这个属性。因此,每个类都有自己的'$ name'定义。 [Clicky](https://eval.in/private/830e62ffefe9ab) –

+0

但是,当'$ name'被定义为'protected'或'public'时,它确实被'Scotto'取代。我建议阅读[文档](http://php.net/manual/en/language.oop5.visibility.php)了解可见性。它在示例代码中声明:“我们可以重新声明公共和受保护的属性,但不是私有的”。 –

回答

1

我会建议在文档页面上特别阅读this comment。重点在于方法,但属性相同

...私有方法只对定义它们的类可见,而子类不会看到父级的私有方法。如果孩子没有看到父母的私人方法,孩子不能覆盖他们。

你举的例子:

class A { 
    private $name = "Joe"; 

    public function getName() { 
    return $this->name; 
    } 
} 

class B extends A { 
    private $name = "Scotto"; 
} 

class C extends A { 
    private $name = "Scotto"; 

    public function getName() { 
    return $this->name; 
    } 
} 

$a = new A; 
$b = new B; 
$c = new C; 

$a->getName(); // 'Joe' 
$b->getName(); // 'Joe' 
$c->getName(); // 'Scotto'