谈到封装大家都会想到另外一个词就是:信息隐藏(information hiding), 如果一开始让你理解封装就直接谈信息隐藏并不一定有帮助或者更好的理解,那我们实际上可以先去了解什么是划分(compartments)。
Crady Booch给出以下描述:
封装就是划分一个抽象的诸多元素的过程,这些元素构成抽象的接口和行为;封装的作用就是将抽象的契约接口与其实现分离
一旦把一个复杂的大问题模块化华为多个可解决的子问题。就可以利用封装来得到较小的抽象,并对他们完成划分(compartmentalizing)。
在PHP中,可见性(visibility)是指对类属性的访问或者说是存取也行。PHP使用3种类型的可见性:
private、protected和public 没错,分别就是私有、保护和公有;可以采用这些可见性来封装和访问程序
1、Private
要封装一个程序元素.最容易的方法就是设置为私有(private)\这说明这个属性只能在 同一个类中访问,它只对同一个类中的元素可见;
示例:
<?php
//封装性
//私有private 保护protected 公有public
//要封装一个程序元素.最容易的方法就是设置为私有(private)\这说明这个属性只能在 同一个类中访问,它只对同一个类中的元素可见,
Class PrivateVis
{
private $money;
public function __construct()
{
$this->money=200;
$this->secret();
}
private function secret()
{
echo $this->money;
}
}
$woker = new PrivateVis();
当然运行的时候会返回200;
首先这个例子构造函数是PrivateVis的一部分,所以它能够访问所有私有的属性和方法;应用同一个类中的属性和方法PHP要求使用$this ;这个类外部对象只能看到secret()输出的结果而无法去改变类中的方法和属性;
2、Protected
如果属性设置为私有,只允许同一个类中的元素去访问这个属性,protected不同:如果属性的可见性为保护,则允许这个类中以及子类都可以访问该属性。抽象方法和具体方法的可见性都可以设置为保护(protected),下面的例子显示了如何使用具有保护可见性的抽象类和具体实现:
<?php
abstract class ProtectedVis
{
abstract protected function countMoney();
protected $wage;
protected function setHourly($hourly)
{
$money = $hourly;
return $hourly;
}
}
子类扩展一个包含方法的抽象类时,对于抽象方法,在使用之前必须先实现这个抽象方法。对于有保护可见性的具体方法,子类可以直接使用,而无需另行实现:
<?php
include_once('ProtectedVis.php');
class ConcreteProtected extends ProtectedVis
{
function __construct()
{
$this->countMoney();
}
protected function countMoney()
{
// TODO: Implement countMoney() method.
$this->wage = "Your Hourly wage is $";
echo $this->wage.$this->setHourly(36);
}
}
$woker = new ConcreteProtected();
注意抽象方法countMoney使用了继承来的setHourly()方法。继承的所有属性和方法都需要使用$this语句。第一访问保护属性时,要使用公共构造函数。
尽管封装性不及私有可见行,但是保护可见性能够对程序中更大的机构完成封装。这个更大的结构由父类和他的子类构成
3 、Public
要访问疯传的个对象,必须提供公共可见性。要想左右一个真正有用的类,其中至少要有一些方法就可见的,即使时构造函数。当然所有的构造函数都是公共的。如果你的程序包含一个构造函数,这个类之外的对象就能通过实例化这个类来访问它。举例:
<?php
/**
* Create by PhpStorm
* Author : wqzbxh
* Date : 2019/11/27
* time :23:06
*/
class PublicVis
{
private $password;
private function openSesame($someData)
{
$this->password = $someData;
if($this->password = 'secret')
{
echo "You're in<br/>";
}
else
{
echo "Release the hounds!<br/>";
}
}
public function unlock($safe)
{
$this->openSesame($safe);
}
}
$woker = new PublicVis();
$woker->unlock("secret");
$woker->unlock('duh')
通常含有公共方法或者属性是为了提供一个途径,从而可以写一个没有构造函数自动启动对象而保持交流,。在publicVis.php文件中,$password属性和openSesame属性都是私有的,unlock方法时公共的,因为他是PublicVis类的一部分,所以他能够访问该类的私有属性和方法
链接:封装之获取方法和设置方法