Php 简明教程
PHP - Encapsulation
PHP 实现了 encapsulation ,这是 OOP 的一个重要原则,带有访问控制关键字 public, private 和 protected 。
封装是指将对象的数据成员或属性远离类外部环境获取的方式,仅允许通过类中可用的方法或函数进行受控访问。
下图展示了面向对象编程方法中封装的原则。
PHP 的关键字列表包含以下关键字,这些关键字决定了 PHP 中对象实例的属性和方法的可访问性 −
-
Public − 类成员可以在任何地方访问,即使是在类的作用域之外,但只能通过对象引用访问。
-
Private − 类成员可以在类本身内访问。它防止成员在类实例的引用下从类外访问。
-
Protected − 成员只能在类和其子类内访问,在其他任何地方都不能访问。
这三个关键字“ public, private 和 protected ”通常称为访问修饰符。它们也被称为可见性模式,因为它们决定了某类成员可以使用的范围。
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 中类成员的可访问性规则: