回覆列表
  • 1 # 碼哥位元

    在php中,protected和private對於子類的區別是:

    對於protected成員變數,子類中使用是不會呼叫__get和__set方法的;

    而對於private成員變數,因為無法獲取到私有成員,而走__get和__set方法進行獲取和賦值。

    如下有個例子:

    class Person

    {

    protected $name;

    private $age;

    public function __get($name)

    {

    var_dump(‘in getter’);

    return $this->$name;

    }

    public function __set($name,$val)

    {

    var_dump(‘in setter’);

    $this->$name = $val;

    }

    }

    class Student extends Person

    {

    public function foo()

    {

    $this->name = ‘Mr. Test’;

    var_dump($this->name);

    $this->age = 8;

    var_dump($this->age);

    }

    }

    $test = new Student;

    $test->foo();

    執行結果如下:

    string(8) “Mr. Test”

    string(9) “in setter”

    string(9) “in getter”

    int(8)

    其中,第一行輸出是列印name成員的值,第二行輸出是在給age賦值前列印的,第三行是獲取age值前列印的,第四行是age的值。

  • 2 # 知識邦

    面向對像對成員變數修飾三種方式

    public:公共的,共有的,公開的

    protected:受保護的

    private:私有的

    三種方式說明:

      public、protect、private和extends(繼承)、重寫

      # 外部呼叫類內部變數, 只能呼叫public的變數

      # 外部呼叫類內部函式, 只能呼叫預設或者public的函式

      # 類函式呼叫內部變數沒有限制

      # 類函式呼叫內部函式沒有限制

      # 透過子類呼叫父類函式, private會報錯, public,protected正常

      # 子類呼叫父類變數, private會報錯, public,protected正常

      # 子類重寫父類函式,沒限制

      # 子類重寫父類函式後,呼叫重寫前的用:parent::XXX();呼叫重寫後的用:self::XXX()或者$this->XXX;

      # 繼承父類的普通變數,相當於複製一份變數給子類。 因此重寫不影響父類,也無法訪問父類原本的普通變數。

      #繼承父類的靜態變數,子類和父類用同一份變數,若子類修改靜態變數的值(在子類的函式內修改),父類會受影響。

      #若子類重寫父類的靜態變數(在子類的函式外,類內修改),相當於父類複製一份靜態變數給子類,此時子類修改靜態變數的值(在子類的函式內修改),父類不受影響。

      # 子類重寫父類靜態方法,修改子類靜態變數,父類不受影響;

      # 重寫的訪問控制權不能縮小 訪問控制權從大到小排序 public>protected>private

      # 非靜態成員不能修改為靜態成員

      # 靜態成員不能修改為非靜態成員

  • 3 # 雲峰網際網路

    成員變數定義為protect和private 同時設定set get方法,對於子類而言的區別是什麼?該問題的答案是:

    1.對於protect成員變數而言,子類可以過載方法來訪問和改寫成員變數的值。

    2.對於private成員變數而言,子類無法讀取和改寫其值。

  • 中秋節和大豐收的關聯?
  • 勞動對人的意義和價值是什麼?