乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      PHP類中訪問控制的一些Tips

       硬核項目經(jīng)理 2021-05-31

      PHP類中訪問控制的一些Tips

      包括PHP在內的大部分面向對象的編程語言,都提供了對類的變量或方法的訪問控制。這是實現(xiàn)面向對象封裝能力的基礎。變量其實就是數(shù)據(jù),而方法函數(shù)就是處理這些數(shù)據(jù)的操作,根據(jù)最少知識原則,一些數(shù)據(jù)你不需要知道它的存在。這時,就需要使用private私有的變量和方法,私有的變量或方法只有這個類自己可以訪問。而有些變量和方法自己的子類需要使用,但又不能暴露給外部,那么我們就會使用protected,也就是受保護的。最后就是公開不管類內部、外部還是繼承的子類都可以使用的public公共變量或方法了。

      我們通過變量的訪問控制先來復習一下這三種訪問控制符的作用。

      class A {
      private $private;
      protected $protected;
      public $public;

      public function setPrivate($p){
      $this->private = $p;
      }

      public function setProtected($p){
      $this->protected = $p;
      }

      public function setPublic($p){
      $this->public = $p;
      }

      public function testA(){
      echo $this->private, '===', $this->protected, '===', $this->public, PHP_EOL;
      }
      }

      class B extends A{
      public function testB(){
      echo $this->private, '===';
      echo $this->protected, '===', $this->public, PHP_EOL;
      }
      }

      $a = new A();
      // $a->private = 'a-private'; // atal error: Uncaught Error: Cannot access private property A::$private
      $a->setPrivate('a-private');
      // $a->protected = 'a-protected'; // atal error: Uncaught Error: Cannot access protected property A::$protected
      $a->setProtected('a-protected');
      $a->public = 'c-public';
      $a->testA();

      echo "Out side public:" . $a->public, PHP_EOL;
      // echo "Out side private:" . $a->private, PHP_EOL; // Fatal error: Uncaught Error: Cannot access private property A::$private
      // echo "Out side protected:" . $a->protected, PHP_EOL; // Fatal error: Uncaught Error: Cannot access protected property A::$protected

      $b = new B();
      $b->setProtected('b-protected');
      $b->public = 'b-public';
      $b->testB(); // 沒有b-private

      $b->setPrivate('b-private');
      $b->testB(); // 沒有b-private

      從上述代碼中很清晰的可以看出,除了public之外的變量都不能在類外部直接調用或者賦值。所以我們使用setXXX()的public方法來為$private和$protected賦值。這里就出現(xiàn)了封裝的概念了,比如在setPrivate()中我們就可以對傳遞過來的$p變量進行邏輯判斷而決定是否將值賦給$private。

      B類繼承了A類,所以它可以訪問到A類的$public和$protected變量,但是,請注意,$private變量是無法訪問到的。所以即使調用了setPrivate()方法為$private賦值了,但因為B無法訪問,所以依然取不到$private的值。有小伙伴要問了,這種情況不報錯?當然不會報錯,B類會在自己的范圍內查找$private變量,沒有定義的話就會生成一個局部的變量并賦值為空。

      那么子類要使用$private應該怎么辦呢?

      class C extends A {
      private $private;

      public function testC(){
      echo $this->private, '===', $this->protected, '===', $this->public, PHP_EOL;
      }

      // public function setPrivate($p){
      // $this->private = $p;
      // }
      }

      $c = new C();
      $c->setProtected('c-protected');
      $c->public = 'c-public';
      $c->setPrivate('c-private');
      $c->testC();

      先不要打開C類setPrivate()方法的注釋,你會發(fā)現(xiàn)$private依然是空值。也就是說,定義了同名的$private私有變量并不是對父類的變量覆蓋,而是在本類作用域內新建了一個。父類的setPrivate()方法當然也不能訪問子類的private變量,因此,子類也要重寫一個setPrivate()方法來為自己的$private變量賦值。

      記住一點:private修飾的變量或方法僅對當前類開放

      對于方法的修飾也是一樣的效果。

      class D {
      public function testD(){
      $this->show();
      }
      private function show(){
      echo 'This is D', PHP_EOL;
      }
      }

      class E extends D {
      private function show(){
      echo 'This is E', PHP_EOL;
      }
      }

      $e = new E();
      $e->testD(); // This is D

      子類E調用父類D的testD()方法,testD()方法中調用的是private修飾的show()方法,根據(jù)上面的原則,它依然調用的是自己D類的show()方法。

      總結

      關于訪問控制的內容還是比較簡單的,最主要的就是private這個修飾符的問題需要注意,其他的其實還是比較好理解的。不過越是簡單的東西越是基礎,面向對象脫離不了這三個簡單的訪問修飾符,它們在現(xiàn)代軟件開發(fā)中的份量十足,只有牢牢掌握它們才是我們正確的學習之道。

      測試代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E7%B1%BB%E4%B8%AD%E8%AE%BF%E9%97%AE%E6%8E%A7%E5%88%B6%E7%9A%84%E4%B8%80%E4%BA%9BTips.php

      參考文檔:https://www./manual/zh/language.oop5.visibility.php#87413https://www./manual/zh/language.oop5.visibility.php#110555https://www./manual/zh/language.oop5.visibility.php

        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多