PHP - 封装



PHP 实现**封装**,这是 OOP 的重要原则之一,它使用访问控制关键字:**public、private** 和 **protected**。

封装是指将对象的成员变量或属性与外部环境隔离开来的机制,只允许通过类中提供的成员方法或函数进行控制访问。

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

PHP Encapsulation 1

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

  • **Public** - 类成员可以从任何地方访问,即使是在类作用域之外,但只能通过对象引用访问。

  • **Private** - 类成员只能在类内部访问。它阻止外部类访问成员,即使是通过类实例的引用。

  • **Protected** - 成员只能在类及其子类中访问,其他地方都不能访问。

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

公共成员

在 PHP 中,类成员(成员变量和成员函数)默认是公共的,除非另有说明。

示例

在下面的程序中,对象的成员变量 title 和 price 可以在类外部自由访问,因为它们默认为公共的,除非另有说明。

<?php
   class Person {
   
      /* Member variables */
      var $name;
      var $age;

      /*Constructor*/
      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

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

由于属性 name 和 age 也是公共的,因此它们也可以从类外部访问,这与封装的原则不符。

私有成员

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

示例

让我们将 name 和 age 属性的声明更改为私有,并运行以下 PHP 脚本:

<?php
   class Person {
   
      /* Member variables */
      private $name;
      private $age;

      /*Constructor*/
      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

错误消息说明了私有属性无法从公共作用域访问的原因。

受保护的成员

指定受保护访问对类成员的影响在类继承的情况下有效。我们知道公共成员可以在类外部的任何地方访问,而私有成员则被拒绝在类外部的任何地方访问。

**protected** 关键字允许访问同一类的对象及其继承类的对象,而拒绝访问任何其他环境。

示例

让我们继承 person 类并定义一个 student 类。我们将 name 属性从私有更改为受保护。student 类有一个新的公共方法 getDetails(),它打印 name 和 age 属性的值。

Person 类

<?php
class Person {

   /* Member variables */
   protected $name;
   private $age;

   /*Constructor*/
   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 中类成员的可访问性规则:

PHP Encapsulation 2
广告