为什么派生类访问基类私有属性?

时间:2017-10-14 20:07:00

标签: php

我不明白这个话题。为什么派生类访问基类的私有成员?

<?php
class A{
private  $name; // private variable
private $age; //private variable
}
class B extends A{
 public function Display($name,$age){
 echo $this->name=$name." age is ".$this->age=$age;
   }
}

$ob=new B();
$ob->Display("xyz",23);
?>

输出: xyz年龄是23岁

1 个答案:

答案 0 :(得分:2)

B类不会继承$name$age属性,因为它们是私有的。

但是,PHP将允许您分配变量而不首先将它们声明为类属性:

<?php
class A
{
    private $name; // private variable
    private $age; //private variable

    public function __construct()
    {
        $this->name = "a";
    }
}
class B extends A
{
    public function display($name, $age) {
        $this->name2 = $name; // new name2 variable, NOT A's name
        $this->age2 = $age; // new age2 variable, NOT A's age
        echo $this->name2." age is ".$this->age2.PHP_EOL; 
        echo $this->name; // A's name, undefined property warning!
    }
}

$ob=new B();
$ob->display("xyz", 23);

Demo

   xyz年龄是23岁

请注意我如何使用name2age2代替nameage,输出仍然正确。如您所见,您无法访问A::$name,但B::$name2中已定义B::display(),并且尝试访问A::$name会为您提供未定义的属性警告。

因此,虽然不完全直观,但这是PHP的预期行为。