php面向对象全攻略 (五) 封装性_php基础

9.封装性
封装性是面向对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个
独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:1.把对象的全部属性和全
部服务结合在一起,形成一个不可分割的独立单位(即对象)。2.信息隐蔽,即尽可能隐蔽对
象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外
部发生联系。
封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据
(属性),从而有效的避免了外部错误对它的“交叉感染”,使软件错误能够局部化,大大减
少查错和排错的难度。
用个实例来说明吧,假如某个人的对象中有年龄和工资等属性,像这样个人隐私的属性
是不想让其它人随意就能获得到的,如果你不使用封装,那么别人想知道就能得到,但是如
果你封装上之后别人就没有办法获得封装的属性,除非你自己把它说出去,否则别人没有办
法得到
再比如说,个人电脑都有一个密码,不想让其它人随意的登陆,在你的电脑里面拷贝和
粘贴。还有就是像人这个对象,身高和年龄的属性,只能是自己来增长,不可以让别人随意
的赋值等等。
使用private 这个关键字来对属性和方法进行封装:
原来的成员:
var $name; //声明人的姓名
var $sex; //声明人的性别
var $age; //声明人的年龄
function run(){… … .}
改成封装的形式:
private $name; //把人的姓名使用private 关键字进行封装
private $sex; //把人的性别使用private 关键字进行封装
private $age; //把人的年龄使用private 关键字进行封装
private function run(){… … } //把人的走路方法使用private 关键字进行封装
注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字“var”。
通过private 就可以把人的成员(成员属性和成员方法)封装上了。封装上的成员就不能
被类外面直接访问了,只有对象内部自己可以访问;下面的代码会产生错误:
代码片段

复制代码 代码如下:

class Person{
//下面是人的成员属性
private $name; //人的名字,被private封装上了
private $sex; //人的性别, 被private封装上了
private $age; //人的年龄, 被private封装上了
//这个人可以说话的方法
function say(){
echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";
}
//这个人可以走路的方法, 被private封装上了
private function run(){
echo "这个人在走路";
}
}
//实例化一个人的实例对象
$p1=new Person();
//试图去给私有的属性赋值, 结果会发生错误
$p1->name="张三";
$p1->sex="男";
$p1->age=20;
//试图去打印私有的属性, 结果会发生错误
echo $p1->name.”<br>”;
echo $p1->sex.”<br>”;
echo $p1->age.”<br>”
//试图去打印私有的成员方法, 结果会发生错误
$p1->run();

输出结果为:
Fatal error: Cannot access private property Person::$name
Fatal error: Cannot access private property Person::$sex
Fatal error: Cannot access private property Person::$age
Fatal error: Cannot access private property Person::$name
Fatal error: Call to private method Person::run() from context ''
从上面的实例可以看到,私有的成员是不能被外部访问的,因为私有成员只能在本对象
内部自己访问,比如,$p1 这个对象自己想把他的私有属性说出去,在say()这个方法里面访
问了私有属性,这样是可以。(没有加任何访问控制,默认的是public 的,任何地方都可以访
问)
代码片段

复制代码 代码如下:

//这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法
function say(){
echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";
//在这里也可以访问私有方法
//$this->run();
}

因为成员方法say()是公有的,所以我们在类的外部调用say()方法是可以的,改变上面的
代码;
代码片段

复制代码 代码如下:

class Person{
//下面是人的成员属性
private $name; //人的名字,被private封装上了
private $sex; //人的性别, 被private封装上了
private $age; //人的年龄, 被private封装上了
//定义一个构造方法参数为私有的属性姓名$name、性别$sex和年龄$age进行赋值
function __construct($name, $sex, $age){
//通过构造方法传进来的$name给私有成员属性$this->name赋初使值
$this->name=$name;
//通过构造方法传进来的$sex给私有成员属性$this->sex赋初使值
$this->sex=$sex;
//通过构造方法传进来的$age给私有成员属性$this->age赋初使值
$this->age=$age;
}
//这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法
function say(){
echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>";
}
}
//通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
$p1=new Person(“张三”,”男”, 20);
$p2=new Person(“李四”,”女”, 30);
$p3=new Person(“王五”,”男”, 40);
//下面访问$p1对象中的说话方法
$p1->say();
//下面访问$p2对象中的说话方法
$p2->say();
//下面访问$p3对象中的说话方法
$p3->say();

输出结果为:
我的名字叫:张三性别:男我的年龄是:20
我的名字叫:李四性别:女我的年龄是:30
我的名字叫:王五性别:男我的年龄是:40
因为构造方法是默认的公有方法(构造方法不要设置成私有的),所以在类的外面可以访
问到,这样就可以使用构造方法创建对象,另外构造方法也是类里面的函数,所以可以用构
造方法给私有的属性赋初值。Say()的方法是默认公有的, 所以在外面也可以访问的到,说
出他自己的私有属性。
从上面的例子中我们可以看到,私有的成员只能在类的内部使用,不能被类外部直接来
存取,但是在类的内部是有权限访问的,所以有时候我们需要在类的外面给私有属性赋值和
读取出来,也就是给类的外部提供一些可以存取的接口,上例中构造方法就是一种赋值的形
式,但是构造方法只是在创建对象的时候赋值,如果我们已经有一个存在的对象了,想对这
个存在的对象赋值,这个时候,如果你还使用构造方法传值的形式传值,那么就创建了一个
新的对象,并不是这个已存在的对象了。所以我们要对私有的属性做一些可以被外部存取的
接口,目的就是可以在对象存在的情况下,改变和存取属性的值,但要注意,只有需要让外
部改变的属性才这样做,不想让外面访问的属性是不做这样的接口的,这样就能达到封装的
目的,所有的功能都是对象自己来完成,给外面提供尽量少的操作。
如果给类外部提供接口,可以为私有属性在类外部提供设置方法和获取方法,来操作私
有属性.例如:
代码片段

复制代码 代码如下:

prvate $age; //私有的属性年龄
function setAge($age) {
//为外部提供一个公有设置年龄的方法
if($age<0 || $age>130) //在给属性赋值的时候,为了避免非法值设置给属性
return;
$this->age=$age;
}
function getAge(){ //为外部提供一个公有获取年龄的方法
return($this->age);
}

上面的方法是为一个成员属性设置和获取值,当然你也可以为每个属性用同样的方法对
其进行赋值和取值的操作,完成在类外部的存取工作

时间: 2024-09-13 00:12:49

php面向对象全攻略 (五) 封装性_php基础的相关文章

百度知道外链发布全攻略 五个误区四个技巧

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 百度知道可谓是让众多的站长们焦头烂额,我也是其中一个,一年前的我第一次开始针对百度知道发外链,开始接触的时候,感觉还是比较容易,但是过了两天发现这也留不了,那也留不了,当时真是死的心都有了,所以我这一年的经历可谓是一路坎坷,过百关砍千将,终于总结成百度知道外链发布的攻略来了--谨记的五个误区四个技巧. 百度知道外链发布的五个误区四个技巧 误区

php面向对象全攻略 (十五) 多态的应用_php基础

多态的应用 多态是除封装和继承之外的另一个面向对象的三大特性之一,我个人看来PHP 中虽然可 以实现多态,但和C++还有Java 这些面向对象的语言相比,多态性并不是那么突出,因为PHP 本身就是一种弱类型的语言,不存在父类对象转化为子类对象或者是子类对象转化为父类对 象的问题,所以多态的应用并不是那么的明显:所谓多态性是指一段程序能够处理多种类型 对象的能力,比如说在公司上班,每个月财务发放工资,同一个发工资的方法,在公司内不 同的员工或是不同职位的员工,都是通过这个方法发放的,但是所发的工资

php面向对象全攻略 (一) 面向对象基础知识_php基础

1.面向对象的概念 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,OOP 达到了软件工程的三个目标:重用性.灵活性和扩展性.为了实现整体运算,每个对象都能够接收信息.处理数据和向其它对象发送信息.面向对象一直是软件开发领域内比较热门的话题,首先,面向对象符合人类看待事物的一般规律.其次,采用面向对象方法可以使系统各部分各司其职.各尽所能.为编程

php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法_php基础

10.__set() __get() __isset() __unset()四个方法的应用 一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取 和赋值操作是非常频繁的,因此在PHP5 中,预定义了两个函数"__get()"和"__set()"来获 取和赋值其属性,以及检查属性的"__isset()"和删除属性的方法"__unset()". 上一节中,我们为每个属性做了设置和获取的方法,在PHP

php面向对象全攻略 (二) 实例化对象 使用对象成员_php基础

5.如何实例化对象 我们上面说过面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然 我们类会声明了,下一步就是实例化对象了. 当定义好类后,我们使用new 关键字来生成一个对象. 代码片段 复制代码 代码如下: $对象名称= new 类名称(): <?php class Person{ //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say(){ //这个人可以

php面向对象全攻略 (四)构造方法与析构方法_php基础

8.构造方法与析构方法 大多数类都有一种称为构造函数的特殊方法.当创建一个对象时,它将自动调用构造函 数,也就是使用new 这个关键字来实例化对象的时候自动调用构造方法. 构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( ).这是PHP5 中 的变化,以前的版本中,构造函数的名称必须与类名相同,这种在PHP5 中仍然可以用,但 现在以经很少有人用了,这样做的好处是可以使构造函数独立于类名,当类名发生改变时不 需要改相应的构造函数名称了.为了向下兼容,如果一个类中没有名

php面向对象全攻略 (八)重载新的方法_php基础

12.重载新的方法 在学习PHP 这种语言中你会发现,PHP 中的方法是不能重载的,所谓的方法重载就是 定义相同的方法名,通过"参数的个数"不同或"参数的类型"不同,来访问我们的相同方法 名的不同方法.但是因为PHP 是弱类型的语言,所以在方法的参数中本身就可以接收不同类 型的数据,又因为PHP 的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用 不相同方法名的不同方法也是不成立的.所以在PHP 里面没有方法重载.不能重载也就是在 你的项目中不能定义相同方

php面向对象全攻略 (十七) 自动加载类_php基础

自动加载类 很多开发者写面向对象的应用程序时,对每个类的定义建立一个PHP 源文件.一个很大 的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在一个PHP 文件中,当在一个PHP 文件 中需要调用另一个文件中声明的类时,就需要通过include 把这个文件引入.不过有的时候, 在文件众多的项目中,要一一将所需类的文件都include 进来,是一个很让人头疼的事,所以 我们能不能在用到什么类的时候,再把这个类所在的PHP 文件导入

php面向对象全攻略 (十) final static const关键字的使用_php基础

14.final 关键字的应用 这个关键字只能用来定义类和定义方法,不能使用final 这个关键字来定义成员属性,因 为final 是常量的意思,我们在PHP 里定义常量使用的是define()函数,所以不能使用final 来 定义成员属性. 使用final 关键标记的类不能被继承: 代码片段 final class Person{ - - } class Student extends Person{ } 会出现下面错误: Fatal error: Class Student may not