Php 简明教程

PHP – Access Modifiers

在 PHP 中,关键字 public, privateprotected 被称为 access modifiers 。这些关键字控制类属性和方法的可访问性或可见性的范围。其中一个关键字在声明成员变量和定义成员函数时添加为前缀。

PHP 代码是否可以自由地访问类成员,或者被限制获取,或者有条件地访问,是由这些关键字决定的 -

  1. Public − 类成员从任何地方都可以访问,即使在类作用域外,但只可以使用对象引用。

  2. Private − 类成员可以在类中访问。它防止外部类访问成员,即使参考了类实例。

  3. Protected − 成员只能在类及其子类中访问,其他地方都不能访问。

数据封装原则是面向对象编程方法的基础。它指的是将对象的成员数据或属性置于类外部环境的访问范围之外,只允许通过类中可用的方法或函数进行受控访问。

要实现封装,类的成员数据被设为 private ,方法被设为 public

access modifiers 1

Public Members

在 PHP 中,类成员(成员变量和其他成员函数)默认情况下是公开的。

Example

在下面的程序中,对象的成员变量 title 和 price 在类的外部可以自由访问,因为它们默认情况下是公开的,除非另行指定。

<?php
   class Book {
      /* Member variables */
      var $price;
      var $title;

      /*Constructor*/
      function __construct(string $param1="PHP Basics", int $param2=380) {
         $this->title = $param1;
         $this->price = $param2;
      }

      function getPrice() {
         echo "Title: $this->price \n";
      }

      function getTitle() {
         echo "Price: $this->title \n";
      }
   }
   $b1 = new Book();
   echo "Title : $b1->title Price: $b1->price";
?>

它将生成以下 output

Title : PHP Basics Price: 380

Private Members

如上所述,封装原则要求不得直接访问成员变量。只有方法应具有对数据成员的访问权。因此,我们需要将成员变量设为私有,并将方法设为公有。

<?php
   class Book {
      /* Member variables */
      private $price;
      private $title;

      /*Constructor*/
      function __construct(string $param1="PHP Basics", int $param2=380) {
         $this->title = $param1;
         $this->price = $param2;
      }

      public function getPrice() {
         echo "Price: $this->price \n";
      }

      public function getTitle() {
         echo "Title: $this->title \n;";
      }
   }
   $b1 = new Book();
   $b1->getTitle();
   $b1->getPrice();
   echo "Title : $b1->title Price: $b1->price";
?>

Output

现在,getTitle() 和 getPrice() 函数是公共的,能够访问私有成员变量 title 和 price。但是,如果尝试直接显示标题和价格,会遇到错误,因为它们不是公共的。

Title: PHP Basics
Price: 380
Fatal error: Uncaught Error: Cannot access private property
Book::$title in hello.php:31

Protected Members

针对类成员指定受保护的访问权在类继承的情况下有效。我们知道可以从类的外围访问公有成员,并且不能从类的外围访问私有成员。

protected 关键字允许访问同一类的对象和继承类中的对象,但禁止访问其他环境。

让我们在 Book 类示例中将标题成员设置为受保护的,将价格保留为私有的。

class Book {
   /* Member variables */
   private $price;
   protected $title;
   # rest of the code kept as it is
}
$b1 = new Book();
$b1->getTitle();
$b1->getPrice();

PHP 允许访问两个成员变量,因为该对象属于同一个类。

让我们添加一个 mybook 类,它继承了 Book 类 −

class mybook extends Book {
   # no additional members defined
}

它的对象仍能访问成员变量,因为子类继承了父类的公有和受保护的成员。

但是,将 mybook 类作为一个独立的类(不扩展 Book 类)并定义一个 getmytitle() 函数,该函数尝试访问 Book 类的受保护标题成员变量。

class mybook {
   public function getmytitle($b) {
      echo "Title: $b->title <br/>";
   }
}
$b1 = new mybook();
$b = new Book();
$b1->getmytitle($b);

由于 getmytitle() 函数尝试打印 Book 对象的标题,因此一个显示 Cannot access protected property Book::$title 的错误消息被引发。

Example

尝试运行以下代码 −

<?php
   class Book {
      private $price;
      protected $title;
      function __construct(string $param1="PHP Basics", int $param2=380) {
         $this->title = $param1;
         $this->price = $param2;
      }
      public function getPrice(){
         echo "Price: $this->price <br/>";
      }
      public function getTitle(){
         echo "Title: $this->title <br/>";
      }
   }
   class mybook {
      public function getmytitle($b) {
         echo "Title: $b->title <br/>";
      }
   }
   $b1 = new mybook();
   $b = new Book();
   $b1->getmytitle($b);
?>

它将生成以下 output

PHP Fatal error:  Uncaught Error: Cannot access protected property
   Book::$title in /home/cg/root/97848/main.php:18

因此,可以看到受保护的成员只能被同一类和继承类的对象访问。对于所有其他环境,受保护的成员不可访问。

可访问性规则可以由下表总结:

access modifiers 2