PHP 手冊 (類與物件) 學習筆記六:訪問控制(可見性)

小彭友發表於2020-06-01

訪問控制(可見性)
描述: 對屬性或方法的訪問控制,是通過在前面新增關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。被定義為公有的類成員可以在任何地方被訪問。被定義為受保護的類成員則可以被其自身以及其子類和父類訪問。被定義為私有的類成員則只能被其定義所在的類訪問

屬性的訪問控制
描述: 類屬性必須定義為公有,受保護,私有之一。如果用 var 定義,則被視為公有。
Example 1:屬性宣告

  class MyClass
   {
       public $public = 'Public';
       protected $protected = 'Protected';
       private $private = 'Private';

       function printHello()
       {
           echo $this->public;
           echo $this->protected;
           echo $this->private;
       }
   }

//   $o = new MyClass();
//   echo $o->public;//Public
//   echo $o->protected;//致命錯誤
//   echo $o->private;//致命錯誤
//   $o->printHello();//PublicProtectedPrivate

   class MyClass2 extends MyClass
   {
       //可以對 public 和 protected 進行重定義,但 private 而不能
       protected $protected = 'Protected2';
//       private $private = 'Private2';
       function printHello()
       {
           echo $this->public;
           echo $this->protected;
           echo $this->private;
       }
   }
   $o2 = new MyClass2();
   echo $o2->public;//Public
//   echo $o2->protected;//致命錯誤
//   echo $o2->private;//致命錯誤
   $o2->printHello();//PublicProtected2然後報undefined錯誤

Note: 為了相容性考慮,在 PHP 4 中使用 var 關鍵字對變數進行定義的方法在 PHP 5 中仍然有效(只是作為 public 關鍵字的一個別名)。在 PHP 5.1.3 之前的版本,該語法會產生一個 E_STRICT 警告

方法的訪問控制
描述: 類中的方法可以被定義為公有,私有或受保護。如果沒有設定這些關鍵字,則該方法預設為公有。
Example 2:方法宣告

 class MyClass
  {
      public function __construct(){ }
      public function MyPublic()
      {
        echo "MyClass MyPublic\n";
      }
      protected function MyProtected()
      {
        echo "MyClass MyProtected\n";
      }
      private function MyPrivate()
      {
          echo "MyClass MyPrivate\n";
      }
      function Foo()
      {
          $this->MyPublic();
          $this->MyProtected();
          $this->MyPrivate();
      }
  }
  $myclass = new MyClass();
  $myclass->MyPublic();//MyClass MyPublic
//  $myclass->MyProtected();//報錯
//  $myclass->MyPrivate();//報錯
  $myclass->Foo();
  /*
   MyClass MyPublic
   MyClass MyProtected
   MyClass MyPrivate
   */

  class MyClass2 extends MyClass
  {
      function Foo2()
      {
          $this->MyPublic();
          $this->MyProtected();
          $this->MyPrivate();//報錯
      }
  }
  $o2 = new MyClass2();
  $o2->MyPublic();//MyClass MyPublic
//  $o2->Foo2();//公有的和受保護的都可執行,但私有的不行

 class Bar
 {
     public function test()
     {
         $this->testPrivate();
         $this->testPublic();
     }

     public function testPublic()
     {
         echo "Bar::testPublic\n";
     }

     private function testPrivate()
     {
         echo "Bar::testPrivate\n";
     }
 }

 class Foo extends Bar
 {
     public function testPublic()
     {
         echo "Foo::testPublic\n";
     }
     private function testPrivate()
     {
         echo "Foo::testPrivate\n";
     }
 }

 $foo = new Foo();
 $foo->test();
 /*
  Bar::testPrivate
  Foo::testPublic
  */

其他物件的訪問控制
描述: 同一個類的物件即使不是同一個例項也可以互相訪問對方的私有與受保護成員。這是由於在這些物件的內部具體實現的細節都是已知的。
Example 3: 訪問同一個物件型別的私有成員

    class Test
    {
        private $foo;
        public function __construct($foo)
        {
            $this->foo = $foo;
        }

        private function bar()
        {
            echo 'Accessed the private method.';
        }

        public function baz(Test $other)
        {
            $other->foo = 'hello';
            var_dump($other->foo);
            $other->bar();
        }
    }

    $test = new Test('test');
    $test->baz(new Test('other'));
    /*
     string(5) "hello"
     Accessed the private method. 
     */

附手冊地址

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章