這三個詞在定義類的屬性和方法時使用,其最大的區別在與他們作用域不同
public :全局使用,不僅是本類,其子類,創建的對象都可以使用,甚至子類的子類由於繼承關系,也可以使用.
protected:本類和其子類使用,如果后續有繼承的話,
private : 僅限本類使用
class ClassA
{
public $a = 1;
protected $b = 2;
private $c = 3;
public function share() {
echo 'a='.$this->a."\n";
echo 'b='.$this->b."\n";
echo 'c='.$this->c."\n";
}
protected function fuZi() {
echo 'a='.$this->a."\n";
echo 'b='.$this->b."\n";
echo 'c='.$this->c."\n";
}
}
class ClassB extends ClassA
{
public function jiCheng() {
echo '我是B類繼承了protected的屬性b='.$this->b."\n";
echo '我是B類繼承的protected方法'.parent::fuZi()."\n";
}
//
/*protected function fuzi()
{
echo 'i am b';
}*/
}
class ClassC extends ClassB
{
public function Cji() {
echo '我是C類繼承了B類a='.$this->a."\n";
echo '我是C類繼承了B類b='.$this->b."\n";
$this->fuZi();
}
}
$classB = new ClassB();
$classB->jiCheng();//經過測試繼承的protected方法屬性都可以獲取
$classC = new ClassC();
$classC->Cji();
執行結果如下圖
由於B繼承了A,C又繼承了B,因此就將A里protected屬性和方法傳遞到了C,如果在B里面使用函數的覆蓋,會發現C類里的fuZi函數也跟着變化,這說明protected屬性的作用域是本類和子類,如果在子類中進行了覆蓋,后續使用將是新的函數,將代碼中B類fuZi函數注釋釋放,得到下圖結果: