封装性是面向对象编程中的三大特征之一

 时间:2024-10-26 13:18:22

1、封装性是面向对象编程中的三大特征之一,封装性就是把对象的成员属性和成员方法结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含如下两个含义。把对象的全部成员属性和全部成员方法结合在一起,形成一个不可分割的独立单位(即对象)信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口是指与外部发生联系。对象中的成员属性如果没有被封装,一旦对象创建完成,就可以通过对象的引用获取任意的成员属性的值,并能够给所有的成员属性任意赋值。在对象的外部任意访问对象中的成员属性时非常危险的,因为对象中的成员属性时对象本身具有的与其他对象不同的特征,是对象某个方面性质的表现。例如,“电话”的对象中有一些属性值是保密技术,是不想让其他人随意能获取到的。在比如,在”电话”对象中的电压和电流等属性的值,需要规定在一定的范围内,是不能被随意赋值的。如果对这些属性赋一些非法的值,例如手机的电压赋上380V的值,就会破坏电话对象。 对象中的成员方法如果没有被封装,也可以在对象的外部随意调用,这也是一种危险的操作。因为对象中的成员方法只有部分是给外部提供的。保留有限的对外接口使之与外部发生联系。而又一些事对象自己使用的方法。例如,在”人”的对象中,提供了”走路”的方法,而”走路”的方法又是通过在对象内部调用”迈左腿”和” 迈右腿”两个方法组成。如果用户在对象的外部直接调用” 迈左腿”或” 迈右腿”的方法就没有意义,应该只让用户能调用”走路”的方法。封装的原则就是要求对象以外的部分不能随意存取对象的内部数据(成员属性和成员方法).从而有效地避免了外部错误对它的”交叉感染”,是软件错误能够局部化,大大较少差错和拍错的难度

2、设置私有成员只有在声明成员属性或成员方法时,使用private关键字修饰就实现了对成员的封装。封装后的成员在对象的外部不能被访问,但在对象内部的成员方法中可以访问到自己对象内部被封装的成员属性和被封装的成员方法。达到了对对象成员保护的目的,只能是对象自己使用,其他人不可以访问自己的私有成员。即尽可能隐蔽对象的内部细节,对外形成一道屏障。在下面例子中,我们使用private关键字将Person类中的部分成员属性和部分成员方法进行封装。<?phpClass Person{ //下面是声明人的成员属性,全部使用了private关键字封装 Private $name; //第一个成员属性$name定义人的名字,此属性被封装 Private $sex; //第二个成员属性$sex定义人的性别,此属性被封装 Private $age; //第三个成员属性$age定义人的年龄,此属性被封装Function __construct($name=””,$sex=”男”,$age=1){ $this->name = $name; $this->sex = $sex; $this->age = $age;}//在类中声明一个走路方法,调用两个内部的私有方法完成Function run(){Echo $this->name.”在走路时”.$this->lfetleg().”再”.$this->rightleg().”<br>”;}Private function leftleg(){ Return “迈左腿”;}Private function rightleg(){ Return “迈右腿”;}}$person1 = new Person();$person1->run(); //run()的方法没有被封装,所以可以在对象外部调用$person1->name = “李四”; //name属性被封装,不能再对象外部给私有属性赋值Echo $person1->age; //age属性被封装,不嗯给你在对象的外部获取私有属性的值$person1->leftleg(); //leftleg()方法被封装,不能再对象外部调用对象中私有的方法该程序的运行结果为:在走路时迈左腿再迈右腿 //调用run()方法输出的结果是Fatal error:Cannot access private property Person::$name in /book/person.class.php on line 29Fatal error:Cannot access private property Person::$age in /book/person.class.php on line 30Fatal error:Call to private property method Person::leftLeg() from context /book/person.class.php on line 31在上面的程序中,使用private关键字将成员属性和成员方法封装成私有属性之后,就不可以在对象的外部通过对象的引用直接访问了,试图去访问私有成员将发生错误,如果在成员属性前面使用了其他的关键字修饰,就不要再使用”var”关键字修饰了。

3、私有成员的访问对象中的成员属性一旦被private关键字封装成私有之后,就只能在对象内部的成员方法中使用。不能被对象外部直接赋值,也不能再对象外部直接获取私有属性的值。如果不让用户在对象的外部设置私有属性的值,但可以获取私有属性的值,或者允许用户对私有属性赋值,但需要限制一些赋值的条件,解决的办法就是在对象的内部声明一些操作私有属性的共有方法。因为私有的成员属性在对象内部的方法中可以访问,所以在对象中声明一个访问私有属性的方法,再把这个方法通过public关键字设置为共有的访问权限.如果成员方法没有加任何访问控制修饰,默认就是public的,在任何地方都可以访问。这样,在对象外部就可以将公有的方法作为访问接口,间接地访问对象内部私有成员。例如,在Person类中,所有的成员属性都使用private关键字封装上以后,在对象的外部直接获取这个”人”对象中的属性是不允许的。但如果这个人将自己的私有属性自己说出去,对象外部就可以获取到这个对象中的私有属性了。例如,在上例中我们通过构造方法将私有属性赋上初值,以及在对象外部调用run()方法访问对象中的私有属性$name和两个私有方法leftLeg()和rightLeg(),都是间接地在对象外部通过对象中提供的共有方法访问私有属性。在下面的例子中,通过Person类中声明说话的方法say(),将自己对象中所有的私有属性都说出去,还提供几个获取属性的方法,让用户可以单独获取对象中某个私有属性的值,以及提供几个设置属性的方法,单独为某个私有属性重新设置值,而且限制了设置值得条件。<?phpClass Person{//下面是声明人的成员属性,全都使用了private关键字封装Private $name; //第一个成员属性$name定义人的名字,此属性被封装Private $sex; //第二个成员属性$sex定义人的性别,此属性被封装Private $age; //第三个成员属性$age第一人的年龄,此属性被封装Function __construct($name=””,$sex=”男”,$age=1){ $this->name=$name; $this->sex = $sex; $this->age = $age;}//通过这个公有方法可以在对象外部获取私有属性$name的值Public function getName(){ Return $this->name; //返回对象的私有属性的值}//通过这个公有方法可以在对象外部获取私有属性$sex设置值,但限制条件Public function setSex($sex){ If($sex==”男” || $sex==”女”){ $this->sex=$sex; //条件成立将参数传入的值赋给私有属性} }//通过这个公有方法可以在对象外部获取私有属性$age设置值,但限制条件Public function setAge($age){ If($sex>150 || $sex<0) Return; $this->age=$age; //执行词句重新为私有属性赋值}//通过这个公有方法可以在对象外部获取私有属性$age的值Public function getAge(){ If($this->age>30) Return $this->age-10; Else Return $this->age;}Function say(){ Echo “我的名字:”.$this->name.”,性别:”.$this->sex.”,年龄:”.$this->age.”.<br>”;}}$person1 = new Person(“王五”,”男”,40); //创建对象$person1Echo $person1->getName().”<br>”; //访问对象中的公有方法,获取对象中私有属性$name输出$person1->setSex(“女”); //通过公有的方法为私有属性$sex设置合法的值$person1->setAge(200); //通过公有的方法为私有属性$age设置非法的值,赋值失败Echo $person1->getAge().”<br>”; //访问对象中的公有方法,获取对象中私有属性$age输出$person1->say(); //访问对象中的公有方法,获取对象中所有的私有属性并输出上面代码中,声明了一个Person类并将成员属性全部使用private关键字设置为私有属性,不让类外部直接访问,但是在类的内部是有权限访问的。构造方法没有加关键字修饰,所以默认就是公有方法(构造方法不要设置成私有的权限),用户就可以使用构造方法创建对象并为私有属性赋初值。 在上例中,还提供了一些可以在对象外部存取私有成员属性的访问接口,构造方法就是一种为私有属性赋值的形式。但构造方法只能在创建对象时为私有属性赋初值,如果我们已经创建了一个对象,在程序运行中对它的私有属性重新赋值。如果还是通过构造方法传值的形式赋值,则又创建了一个新的对象。所以需要在对象中提供一些可以改变或获取某个私有属性值得访问接口,这和前面直接访问公有属性的形式不同。如果没有使用private封装的成员属性,可以随意被赋值,包括一些非法的值。如果对私有的成员属性通过公有的方法访问,则可以在公有的方法中增加一些限制条件,便面一些非法的操作。这样就能达到封装的目的,所有的功能都是对象自己来完成,给外面提供尽量少的操作。 在上例中,用户就可以在对象的外部通过对象中设置的公有方法getName(),作为单独获取对象中的私有属性$name的访问接口.但没有提供设置$name属性值的接口,这就意味着一旦对象创建完成以后,就无法再改变对象中成员属性$name的值。同样提供了设置年龄属性和获取年龄的访问接口,但在设置和获取值时都限制了一些条件。对象中的成员方法say()没有添加访问控制权限,默认就是公有的访问权限,所以在对象的外面也可以直接放,获取对象中所有的私有属性

  • 我是岁月你是星辰电视剧剧情介绍
  • 车联网行业需求及解决方案
  • Word文档怎么进行拼写检查?
  • VS如何进行捕获选项的设置
  • 福耀科技大学985还是211
  • 热门搜索
    文明校园手抄报 国庆节的手抄报怎么画 美丽的祖国手抄报 英语早餐手抄报 国庆节手抄报清楚文字 戏曲大舞台手抄报 中秋节英语手抄报 关于爱的手抄报 我的中国梦手抄报画 教师节英语手抄报