1. 程式人生 > >php 定義類屬性和方法的public protected private 修飾詞的區別

php 定義類屬性和方法的public protected private 修飾詞的區別

這三個詞在定義類的屬性和方法時使用,其最大的區別在與他們作用域不同
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函式註釋釋放,得到下圖結果: