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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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