2017-10-14 137 views
1

我不明白這個話題。爲什麼派生類訪問基類的私有成員?爲什麼基類私有屬性被派生類訪問?

<?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

+0

你只需要讓你變成'''protected'''而不是'''private''' –

回答

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,而th e輸出仍然正確。正如你所看到的,你沒有訪問A::$name,但在B::display()中定義的B::$name2,並試圖訪問A::$name給你一個未定義的屬性警告。

因此,雖然不完全直觀,但這是PHP的預期行爲。

相關問題