PHP - 封装


PHP 通过访问控制关键字 publicprivate 和 protected 实现封装,这是 OOP 的重要原则之一。

封装是指使对象的数据成员或属性远离类外部环境的机制,仅允许通过类中可用的方法或函数进行受控访问。

下图说明了面向对象编程方法中的封装原理。

PHP 封装 1

PHP 关键字列表包含以下关键字,这些关键字确定对象的属性和方法的可访问性,该对象是 PHP 中类的实例 -

关键字 描述
Public  可以从任何位置访问类成员,甚至可以从类范围之外访问,但只能通过对象引用访问。
Private  可以在类本身中访问类成员。它阻止成员从类外部访问,即使使用类实例的引用也是如此。
Protected  只能在类及其子类中访问成员,而不能在其他任何位置访问。

这三个关键字 “publicprivate 和 protected” 通常称为访问修饰符。它们也称为可见性模式,因为它们决定某个类成员的可用程度。

公有成员:public

在 PHP 中,类成员(成员变量和成员函数)默认是公有的。

在下面的程序中,对象的成员变量 title price 可以在类外部自由访问,因为如果没有另行指定,它们在默认情况下是 public 的。


<?php
   class Person {
   
      /* 成员变量 */
      var $name;
      var $age;

      /* 构造函数 */
      function __construct(string $param1="Ravi", int $param2=28) {
         $this->name = $param1;
         $this->age = $param2;
      }

      function getName() {
         echo "Name: $this->name" . PHP_EOL;;
      }
      function getAge() {
         echo "Age: $this->age" . PHP_EOL;;
      }
   }
   $b1 = new Person();
   $b1->getName();
   $b1->getAge();
   echo "Name : $b1->name Age: $b1->age" . PHP_EOL;
?>

它将产生以下输出 -

Name: Ravi
Age: 28
Name : Ravi Age: 28

请注意,默认情况下,所有类成员的属性都是 public,如果需要,可以将它们显式声明为 public。因此,可以从类外部调用实例方法 getName() 和 getAge()

由于属性 name age 也是公开的,因此它们也可以在类之外访问,根据封装原则,这不是需要的。

私有成员:Private 

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

让我们将 name age 属性的声明更改为 private 并运行以下 PHP 脚本 -


<?php
   class Person {
   
      /* 成员变量 */
      private $name;
      private $age;

      /* 构造函数 */
      function __construct(string $param1="Ravi", int $param2=28) {
         $this->name = $param1;
         $this->age = $param2;
      }

      public function getName() {
         echo "Name: $this->name" . PHP_EOL;;
      }

      public function getAge(){
         echo "Age: $this->age" . PHP_EOL;;
      }
   }

   $b1 = new Person();
   $b1->getName();
   $b1->getAge();
   echo "Name : $b1->name Age: $b1->age" . PHP_EOL;
?>

它将产生以下输出 -

Name: Ravi
Age: 28
PHP Fatal error:  Uncaught Error: Cannot access private property Person::$name in person.php:27

错误消息告知无法从 public 范围访问 private 属性的原因。

受保护成员:protected 

在类继承的情况下,指定对类成员的受保护访问的效果是有效的。我们知道,公共成员可以从类以外的任何位置访问,而私有成员被拒绝从类以外的任何位置访问。

protected 关键字授予对同一类的对象及其继承类的对象的访问权限,从而拒绝任何其他环境访问该对象。

让我们继承 person 类并定义一个 student 类。我们将 name property private 更改为 protectedstudent 类有一个新的公共方法 getDetails(),用于打印 name age 属性的值。

Person 类


<?php
class Person {

   /* 成员变量 */
   protected $name;
   private $age;

   /* 构造函数 */
   function __construct(string $param1="Ravi", int $param2=28) {
      $this->name = $param1;
      $this->age = $param2;
   }

   public function getName(){
      echo "Name: $this->name" . PHP_EOL;;
   }

   public function getAge() {
      echo "Age: $this->age" . PHP_EOL;;
   }
}

Student 类


class student extends Person {
   public function getDetails() {
      echo "My Name: $this->name" . PHP_EOL;
      echo "My age: $this->age" . PHP_EOL;
   }
}
$s1 = new student();
$s1->getDetails();
?>

它将产生以下输出 -

My Name: Ravi
PHP Warning:  Undefined property: student::$age in person.php on line 28
My age:

下表说明了 PHP 中类成员的可访问性规则 -