php 定義類屬性和方法的public protected private 修飾詞的區別
阿新 • • 發佈:2018-11-20
這三個詞在定義類的屬性和方法時使用,其最大的區別在與他們作用域不同
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函式註釋釋放,得到下圖結果: