class employee{
- private $sal=3000;
- //protected $sal=3000;
- public function getSal(){
- return $this->sal;
- }
- }
- class Manager extends employee {
- protected $sal=5000;
public function getParentSal(){
- //這裡返回的是父類的private屬性.
- return parent::getSal();
- }
- }
- $manager = new Manager();
- echo "PHP ".phpversion()."
";
- echo $manager->getSal();
- echo "
";
- echo "parent's \$sal ".$manager->getParentSal();
- ?>
複製代碼程式運行結果:PHP 5.3.83000parent's $sal 3000 如果父類中的屬性被子類重寫了。結果是這樣的。注意 第5行的屬性定義變成了protected。
class employee{
- //private $sal=3000;
- protected $sal=3000;
- public function getSal(){
- return $this->sal;
- }
- }
class Manager extends employee {
- protected $sal=5000;
public function getParentSal(){
- //這裡返回的是父類的private屬性.
- return parent::getSal();
- }
- }
- $manager = new Manager();
- echo "PHP ".phpversion()."
";
- echo $manager->getSal();
- echo "
";
- echo "parent's \$sal ".$manager->getParentSal();
- ?>
複製代碼程式運行結果:PHP 5.3.85000parent's $sal 5000 第一個列子中 父類的private $sal沒有被重寫 所以$manager->getSal()這個父類的方法 調用的是父類自己的私人屬性$sal 此時記憶體中有兩個$sal第二個列子中 父類的protected $sal被重寫 $manager->getSal()這個父類的方法 調用已經被重寫的$sal 父類的$sal在記憶體中是不存在的 此時記憶體中只有一個$sal接下來看第三個列子子類中重寫的方法對當前private有效。
class employee{
- private $sal=3000;
- public function getSal(){
- return $this->sal;
- }
- }
class Manager extends employee {
- private $sal=5000;
- //重寫過的方法
- public function getSal(){
- return $this->sal;
- }
- public function getParentSal(){
- //這裡返回的是父類的private屬性.
- return parent::getSal();
- }
- }
- $manager = new Manager();
- echo "PHP ".phpversion()."
";
- echo $manager->getSal();
- echo "
";
- echo "parent's \$sal ".$manager->getParentSal();
- ?>
複製代碼運行結果PHP 5.3.85000parent's $sal 3000 這個列子中子類重寫getSal()方法 所以他調用的是子類的屬性如果你注釋子類的這一行//private $sal=5000;你會發現一個錯誤:Notice: Undefined property: Manager::$sal in E:\wamp\www\oo\2-5\2-5-3.php on line 14如果注釋掉12行的子類重寫方法 那麼echo $manager->getSal();得到的結果是 父類的私人屬性$sal 3000 開啟zend調試狀態看看,記憶體中的情況。注意最下面,有兩個$sal 。分別是 3000 和 5000 。
- class employee{
- private $sal=3000;
- public function getSal(){
- return $this->sal;
- }
- }
- class Manager extends employee {
- protected $sal=5000;
- public function getParentSal(){
- return $this->sal;
- }
- }
- $manager = new Manager();
- echo "PHP ".phpversion()."
";
- echo $manager->getSal();
- ?>
複製代碼程式運行結果:PHP 5.3.83000 將父類的屬性$sal 改成 protected ,子類重寫了父類的屬性。在記憶體中只有一個 $sal 。
- class employee{
- protected $sal=3000;
- public function getSal(){
- return $this->sal;
- }
- }
- class Manager extends employee {
- protected $sal=5000;
- public function getParentSal(){
- return $this->sal;
- }
- }
- $manager = new Manager();
- echo "PHP ".phpversion()."
";
- echo $manager->getSal();
- ?>
複製代碼程式運行結果:PHP 5.3.85000注意:PHP5調用父類用的是parent:: 而不是 parent-> ,這足以說明PHP5不想在記憶體中讓父類也被建立。PHP5想讓繼承變的比Java更簡單。 |