Php 简明教程

PHP - Encapsulation

PHP 实现了 encapsulation ,这是 OOP 的一个重要原则,带有访问控制关键字 public, privateprotected

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

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

php encapsulation 1

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

  1. Public − 类成员可以在任何地方访问,即使是在类的作用域之外,但只能通过对象引用访问。

  2. Private − 类成员可以在类本身内访问。它防止成员在类实例的引用下从类外访问。

  3. Protected − 成员只能在类和其子类内访问,在其他任何地方都不能访问。

这三个关键字“ public, privateprotected ”通常称为访问修饰符。它们也被称为可见性模式,因为它们决定了某类成员可以使用的范围。

Public Members

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

Example

在下面的程序中,对象的成员变量 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;
?>

它将生成以下 output

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

Note 由于默认情况下类成员的所有属性都为公有,因此如果需要,可以明确地宣告它们为公有。结果,可以从类的外围调用实例方法 getName() 和 getAge()。

由于属性 name 和 age 也是公有的,因此也可以从类外访问它们,这与封装原则相违背。

Private Members

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

Example

让我们将 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;
?>

它将生成以下 output

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

该错误消息表明我们不能从公有范围访问私有属性。

Protected Members

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

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

Example

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

Person class

<?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

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();
?>

它将生成以下 output

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

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

php encapsulation 2