1. 程式人生 > 實用技巧 >PHP面向物件之私有屬性繼承和重寫 private

PHP面向物件之私有屬性繼承和重寫 private

私有屬性繼承和重寫

  • 說明
    • 私有屬性可以繼承但不能重寫

私有-受保護

  • 程式碼分析(私有-受保護)
    • showA()和showB()中的$this都表示B的物件,B中繼承了A的私有屬性,所以B中有兩個$name
    • 在showA()中只能訪問A中的$name,不能訪問B中的$name
    • 在showB()中只能訪問B中的$name,不能訪問A中的$name
<?php 
class A {
  private $name='PHP';
	public function showA() {
    echo $this->name,'<br>';	//PHP
    var_dump($this);
	}
}
class B extends A {
	private $name='Java';
	public function showB() {
    echo $this->name,'<br>';	//Java
	}
}
$obj=new B();
$obj->showA();
$obj->showB();
?> 

受保護

  • 程式碼分析(受保護)
    • private 私有屬性,只能在類的內部訪問,所以showA()可以訪問A中的$this,而showB()只能訪問B中的$this
    • protected 保護屬性,能夠在繼承間屬性繼承,所以showA()和showB()都能夠訪問A中的$this
<?php 
class A {
  protected $name='PHP';
	public function showA() {
    echo $this->name,'<br>';	//PHP
    var_dump($this);
	}
}
class B extends A {
	public function showB() {
    echo $this->name,'<br>';	//PHP
	}
}
$obj=new B();
$obj->showA();
$obj->showB();
?> 

受保護-公有

  • 程式碼分析(受保護-公有)
    • B中將A的$name重寫,所以$obj中只有一個$name,($name='Java')
    • 不管$this在哪個方法中訪問,就只能訪問這個$name
<?php 
class A {
  protected $name='PHP';
	public function showA() {
    echo $this->name,'<br>';	//Java
    var_dump($this);
	}
}
class B extends A {
  public $name='Java';
	public function showB() {
    echo $this->name,'<br>';	//Java
	}
}
$obj=new B();
$obj->showA();
$obj->showB();
?> 

私有-公有

  • 程式碼分析(私有-公有)
    • 在showA()中既能訪問私有的$name,也能訪問公有的$name,但是私有的比公有的許可權高,所以輸出PHP
    • 在showB()中不能訪問私有的$name,只能訪問公有的$name,所以輸出Java
<?php 
class A {
  private $name='PHP';
	public function showA() {
    echo $this->name,'<br>';	//PHP
    var_dump($this);
	}
}
class B extends A {
  public $name='Java';
	public function showB() {
    echo $this->name,'<br>';	//Java
	}
}
$obj=new B();
$obj->showA();
$obj->showB();
?>