PHP 手册 (类与对象) 学习笔记六:访问控制(可见性)

访问控制(可见性)
描述: 对属性或方法的访问控制,是通过在前面添加关键字 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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!