下面是对于「php面向对象全攻略(五)封装性」的完整攻略说明:
什么是封装性
面向对象三大特性中的封装性指的是把对象(或类)的内部状态和行为对外部隐藏起来,只向外部暴露必要的接口,以保证内部数据的安全和灵活性。
具体来说,通过使用访问控制符来限制属性和方法的访问级别。主要有private,protected和public,其中private表示只能在当前类内部访问,protected表示只能在当前类和其子类中访问,public表示所有对象都可以访问。
封装性示例
- 封装性的保护作用
class User {
private $username;
private $password;
// 构造函数设置用户名和密码
public function __construct($username, $password) {
$this->username = $username;
$this->password = $this->encryptPassword($password);
}
// 加密密码
private function encryptPassword($password) {
return md5($password);
}
// 获取用户名
public function getUsername() {
return $this->username;
}
// 登录
public function login($password) {
return $this->encryptPassword($password) === $this->password;
}
}
$user = new User('demo', '123456');
echo $user->getUsername(); // 输出 'demo'
echo $user->password; // 报错, private属性只能在类内部访问
在上面的示例中,$user
对象的外部访问只能调用getUsername()
方法获取用户名,而不能直接访问$password
属性获取密码。这样就保证了$password
属性的安全性。
- 可扩展的封装性
class Shape {
protected $x;
protected $y;
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
public function getArea() {
// 子类可以根据自己的特性来实现具体的计算方式
}
}
class Circle extends Shape {
protected $radius;
public function __construct($x, $y, $radius) {
parent::__construct($x, $y);
$this->radius = $radius;
}
public function getArea() {
return pi() * pow($this->radius, 2);
}
}
class Rectangle extends Shape {
protected $width;
protected $height;
public function __construct($x, $y, $width, $height) {
parent::__construct($x, $y);
$this->width = $width;
$this->height = $height;
}
public function getArea() {
return $this->width * $this->height;
}
}
$circle = new Circle(0, 0, 5);
echo $circle->getArea(); // 输出 78.539816339744
$rectangle = new Rectangle(0, 0, 3, 4);
echo $rectangle->getArea(); // 输出 12
在上面的示例中,Shape
类是一个基础类,含有$x
和$y
两个属性和一个getArea()
方法。Circle
类和Rectangle
类都继承了Shape
类,并且实现了自己的getArea()
方法,计算圆形和矩形的面积。
这个示例展示了封装性的可扩展性。在Shape
类中,只定义了最基础的属性和方法;子类可以根据自己的特性,自由扩展自己的功能。而对于外部调用者来说,只需要调用基类的接口,就可以获取所有子类的功能。
总结一下,封装性是一个非常重要的面向对象特性,能够有效地保证代码的安全性和可扩展性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php面向对象全攻略 (五) 封装性 - Python技术站