PHP 通过访问控制关键字 public、private 和 protected 实现封装,这是 OOP 的重要原则之一。
封装是指使对象的数据成员或属性远离类外部环境的机制,仅允许通过类中可用的方法或函数进行受控访问。
下图说明了面向对象编程方法中的封装原理。
PHP 关键字列表包含以下关键字,这些关键字确定对象的属性和方法的可访问性,该对象是 PHP 中类的实例 -
关键字 | 描述 |
---|---|
Public | 可以从任何位置访问类成员,甚至可以从类范围之外访问,但只能通过对象引用访问。 |
Private | 可以在类本身中访问类成员。它阻止成员从类外部访问,即使使用类实例的引用也是如此。 |
Protected | 只能在类及其子类中访问成员,而不能在其他任何位置访问。 |
这三个关键字 “public, private 和 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;
?>
它将产生以下输出 -
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;
?>
它将产生以下输出 -
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 更改为 protected。student 类有一个新的公共方法 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();
?>
它将产生以下输出 -
PHP Warning: Undefined property: student::$age in person.php on line 28
My age:
下表说明了 PHP 中类成员的可访问性规则 -