河南省厅系统项目启动会-上海交通大学生物信息学及_第1页
河南省厅系统项目启动会-上海交通大学生物信息学及_第2页
河南省厅系统项目启动会-上海交通大学生物信息学及_第3页
河南省厅系统项目启动会-上海交通大学生物信息学及_第4页
河南省厅系统项目启动会-上海交通大学生物信息学及_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux+PHP+MYSQL第5讲 面向对象 第5讲 面向对象的PHPOOP的好处关键的OOP概念构造函数和析构函数静态类成员OOP(Object-Oriented Programming,面向对象的编程)OOP的好处封装 继承 多态什么是面向对象编程面对对象技术的基本观点如下:(1)客观世界由对象组成。(2)具有相同数据和操作的对象可归纳成类。(3)类可以派生出子类,子类除了继承除了继承父类的全部特性外还可以有自己的特性(4)对象之间的联系通过消息传递来维系。关键的OOP概念面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程

2、架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三个目标:重用性、灵活性和扩展性。面向对象一直是软件开发领域内比较热门的话题,首先,面向对象符合人类看待事物的一般规律。 其次,采用面向对象方法可以使系统各部分各司其职、各尽所能。为编程人员敞开了一扇大门,使其编程的代码更简洁、更易于维护,并且具有更强的可重用性。PHP 是一个混合型语言,你可以使用OOP,也可以使用传统的过程化编程 。然而,对于大型项目,你可能需要在PHP 中使用纯的OOP去声明类,而且在你的项目里只用对象和类 。关键的OOP概念面向对象编程思想的建立 关键的OOP概念

3、的理解掌握,这是基础 例如:类、类的属性、类的方法、访问权限 构造函数、析构函数等。 如何应用面向对象的编程思想 主要是根据画面和系统的开发架构,源头:理解画面从何而来,目的:类设计好之后的代码如何实现。 关键的OOP概念类 类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。 对象 对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。 类和对象这间的关系 类

4、与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。类描述了一组有相同特性(属性)和相同行为(方法)的对象。 举例:一个装机的配置单,这个配置单就可以想象成是类 。组装的PC机可以看作是该类的对象。将相关的变量和方法封装进一个简洁的软件组合是一种简单而强大的思想,它给软件开发人员提供了两个主要的好处:模块化:一个对象的源代码可以独立于其他对象的源代码进行编写和维护。另外,对象很容易地在系统中传递。你可以将你的自行车对象交给其他人,而它仍然会正常工作。 隐藏信息:对象有一个公共接口,其他对象可以使用这个接口与它通信。对象可以维护私有的信息和方法,可以在任何时候改变

5、这些信息和方法,而不影响依赖于它的其他对象。你不需要理解你自行车使用的变速齿轮机制就能够使用它。软件对象 对象属性型号价格里程行为起动停车行驶属性车轮数量档的数量行为加速换档刹车属性名称颜色品种行为摇尾巴吃东西犬 吠 关键的OOP概念面向对象 如果你想建立一个电脑教室,首先要有一个房间,房间里面要有N台电脑,有N张桌子, N把椅子,白板,投影机等等,这些是什么,刚才咱们说了,这就是对象,能看到的一个个的实体,可以说这个电脑教室的单位就是这一个个的实体对象,它们共同组成了这个电脑教室,那么我们是做程序,这和面向对象有什么关系呢?开发一个系统程序和建一个电脑教室类似,你把每个独立的功能模块抽象成类

6、,形成对象,由多个对象组成这个系统,这些对象之间都能够接收信息、处理数据和向其它对象发送信息等等相互作用。就构成了面向对象的程序。 如何抽象出一个类? 上面已经介绍过了,面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以我们首先要做的就是如何来声明类,做出来一个类很容易,只要掌握基本的程序语法定义规则就可以做的出来,那么难点在那里呢?一个项目要用到多少个类,用多少个对象,在那要定义类,定义一个什么样的类,这个类实例化出多少个对象,类里面有多少个属性,有多少个方法等等,这就需要读者通过在实际的开发中就实际问题分析设计和总结了。 (系统架构师主要是根据每个项目的页面来判断)。关键的O

7、OP概念类的定义: class 类名 举例:人是一个对象,你怎么把一个你看好的人推荐给你们领导呢?首先,你会介绍这个人姓名、性别、年龄、身高、体重、电话、家庭住址等等。然后,你要介绍这个人能做什么,可以开车,会说英语,可以使用电脑等等。总结:所有的对象我们用类去描述都是类似的,从上面人的描述可以看到, 做出一个类来,从定义的角度分两部分,第一是从静态上描述,第二是从动态上描述,静态上的描述就是我们所说的属性,像上面我们看到的,人的姓名、性别、年龄、身高、体重、电话、家庭住址等等。 动态上也就是人的这个对象的功能,比如这个人可以开车,会说英语,可以使用电脑等等 。关键的OOP概念抽象: 抽象成程

8、序时,我们把静态的说成类的属性,把动态的写成函数或者说是方法,函数和方法。 所有类都是从属性和方法这两方面去写,属性又叫做这个类的成员属性,方法叫做这个类的成员方法。 class 人 成员属性:姓名、性别、年龄、身高、体重、电话、家庭住址成员方法:可以开车, 会说英语, 可以使用电脑 属性:通过在类定义中使用关键字 var 来声明变量,即创建了类的属性,虽然在声明成员属性的时候可以给定初始值, 但是在声明类的时候给成员属性初使值是没有必要的,比如说要是把人的姓名赋上“张三”,那么用这个类实例出几十个人,这几十个人都叫张三了,所以没有必要, 我们在实例出对象后给成员属性初始值就可以了。如:var

9、 $somevar;关键的OOP概念方法(成员函数):通过在类定义中声明函数,即创建了类的方法。如:function somefun(参数列表) . . 关键的OOP概念注意:不要给初始的值,因为我们做的人这个类是一个描述信息,将来用它实例化对象,比如实例化出来10个人对象,那么这10个人, 每一个人的名子,性别, 年龄都是不一样的,所以最好不要在这个地方给成员属性赋初值,而是对每个对象分别赋值的。 再做一个类,我们就做个矩形吧,先分析一下,想一想从两方面分析,矩形的属性都有什么?矩形的功能都有什么?class 矩形/矩形的属性矩形的长; 矩形的宽;/矩形的方法矩形的周长;矩形的面积;关键的O

10、OP概念关键的OOP概念如何去使用对象中的成员 ?上面看到PHP对象中的成员有两种一种是成员属性,一种是成员方法。对象我们已经可以声明了,$p1=new Person(); 怎么去使用对象的成员呢?要想访问对象中的成员就要使用一个特殊的操作符“-”来完成对象成员的访问: 对象-属性 $p1-name; $p2-age; $p3-sex; 对象-方法 $p1-say(); $p2-run();name=”张三”;$p1-sex=”男”;$p1-age=20;/下面三行是访问$p1对象的属性echo “p1对象的名子是:”.$p1-name.”;echo “p1对象的性别是:”.$p1-sex.”

11、;echo “p1对象的年龄是:”.$p1-age.”;/下面两行访问$p1对象中的方法$p1-say();$p1-run();关键的OOP概念下面三行是给$p2对象属性赋值$p2-name=”李四”;$p2-sex=”女”;$p2-age=30;/下面三行是访问$p2对象的属性echo “p2对象的名子是:”.$p2-name.”;echo “p2对象的性别是:”.$p2-sex.”;echo “p2对象的年龄是:”.$p2-age.”;/下面两行访问$p2对象中的方法$p2-say();$p2-run();/下面三行是给$p3对象属性赋值$p3-name=”王五”;$p3-sex=”男”;

12、$p3-age=40;/下面三行是访问$p3对象的属性echo “p3对象的名子是:”.$p3-name.”;echo “p3对象的性别是:”.$p3-sex.”;echo “p3对象的年龄是:”.$p3-age.”;/下面两行访问$p3对象中的方法$p3-say();$p3-run();关键的OOP概念特殊的引用“$this”的使用 现在我们知道了如何访问对象中的成员,是通过“对象-成员”的方式访问的,这是在对象的外部去访问对象中成员的形式,那么如果我想在对象的内部,让对象里的方法访问本对象的属性,或是对象中的方法去调用本对象的其它方法这时我们怎么办?因为对象里面的所有的成员都要用对象来调用

13、,包括对象的内部成员之间的调用,所以在PHP里面给我提供了一个本对象的引用$this,每个对象里面都有一个对象的引用$this来代表这个对象,完成对象内部成员的调用, this的本意就是“这个”的意思,上面的实例里面,我们实例化三个实例对象$P1、 $P2、 $P3,这三个对象里面各自存在一个$this分别代表对象$p1、$p2、$p3 。关键的OOP概念通过上图我们可以看到,$this就是对象内部代表这个对象的引用,在对象内部和调用本对象的成员和对象外部调用对象的成员所使用的方式是一样的 修改一下上面的实例,让每个人都说出自己的名字,性别和年龄: 关键的OOP概念name. 性别:.$thi

14、s-sex. 我的年龄是:.$this-age.; function run() /这个人可以走路的方法 echo 这个人在走路; 关键的OOP概念$p1=new Person(); /创建实例对象$p1$p2=new Person(); /创建实例对象$p2$p3=new Person(); /创建实例对象$p3/下面三行是给$p1对象属性赋值$p1-name=张三;$p1-sex=男;$p1-age=20;/下面访问$p1对象中的说话方法$p1-say();/下面三行是给$p2对象属性赋值$p2-name=李四;$p2-sex=女;$p2-age=30;/下面访问$p2对象中的说话方法$p

15、2-say();/下面三行是给$p3对象属性赋值$p3-name=王五;$p3-sex=男;$p3-age=40;/下面访问$p3对象中的说话方法$p3-say();?关键的OOP概念Result: 我的名字叫:张三性别:男我的年龄是:20我的名字叫:李四性别:女我的年龄是:30我的名字叫:王五性别:男我的年龄是:40在$p1、$p2和$p3这三个对象中都有say()这个方法,$this分别代表这三个对象, 调用相应的属性,打印出属性的值,这就是在对象内部访问对象属性的方式, 如果相在say()这个方法里调用run()这个方法也是可以的,在say()这个方法中使用$this-run()的方式来

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

17、 格式:function _construct ( 参数 ) . . 在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。比如对成属性在创建对象的时候赋初值。关键的OOP概念name赋初使值$this-name=$name;/通过构造方法传进来的$sex给成员属性$this-sex赋初使值$this-sex=$sex;/通过构造方法传进来的$age给成员属性$this-age赋初使值$this-age=$age;/这个人的说话方法function say()echo 我的名子叫:.$this-name

18、. 性别:.$this-sex. 我的年龄是:.$this-age.;关键的OOP概念/通过构造方法创建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();?Result:我的名子叫:张三性别:男我的年龄是:20我的名子叫:李四性别:女我的年龄是:30

19、我的名子叫:王五性别:男我的年龄是:40关键的OOP概念析构函数 与构造函数相对的就是析构函数。析构函数是PHP5新添加的内容,在PHP4中没有析构函数。析构函数允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件,释放结果集等,析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,也就是对象在内存中被销毁前调用析构函数。与构造函数的名称类似,一个类的析构函数名称必须是_destruct( )。析构函数不能带有任何参数。 格式:function _destruct ( ) . . 关键的OOP概念name赋初使值$this-name=$name;/通过构造方法传进来的

20、$sex给成员属性$this-sex赋初使值$this-sex=$sex;/通过构造方法传进来的$age给成员属性$this-age赋初使值$this-age=$age;/这个人的说话方法function say()echo 我的名子叫:.$this-name. 性别:.$this-sex. 我的年龄是:.$this-age.;关键的OOP概念/这是一个析构函数,在对象销毁前调用function _destruct()echo “再见”.$this-name.”;/通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄$p1=new Person(“张三”,”男

21、”, 20);$p2=new Person(“李四”,”女”, 30);$p3=new Person(“王五”,”男”, 40);/下面访问$p1对象中的说话方法$p1-say();/下面访问$p2对象中的说话方法$p2-say();/下面访问$p3对象中的说话方法$p3-say();?Result:我的名子叫:张三性别:男我的年龄是:20我的名子叫:李四性别:女我的年龄是:30我的名子叫:王五性别:男我的年龄是:40再见张三再见李四再见王五关键的OOP概念 小结:类的代码规范class Something/ 在OOP中,类的第一字母通常为大写 var $x; #define a setter

22、 for the $x member. function setX($v) /方法开始为小写单词,然后使用大写字母来分割单词,例如:getValueOfArea( ) /另外注意Function要缩进3格 $this-x=$v; #define a getter for the $x member. function getX( ) return this-x; #end Executive class 数据成员在类中使用”var”来定义,在给数据成员赋值之前,它们是没有类型的。一个数据成员可以是一个整数,一个数组或者是一个对象。 方法在类中被定义成函数形式,在方法中访问类成员变量时,你应该使

23、用$this-name,否则对一个方法来说,它只能是局部变量。(PHP5是直接可以使用变量,而不需要事先声明,而其他语言(C#,Java),必须先声明要一个变量的数据类型,才能使用)关键的OOP概念 小结:类的调用$obj = new Something; /在内存中分配存储空间然后你可以使用成员函数通过:$obj -setX(5);$see = $obj -getX();在这个例子中,setX成员函数将5赋值给对象的成员变量x(而不是类的),然后getX返回它的值5.关键的OOP概念 PHP4的OOP 托PHP4的福,这个用途的适用范围逐渐变广起来,作为企业级的用途而使用PHP的说法时有所闻

24、,因此就用了这样一个问题,构筑大规模网站的时候,代码的再利用性十分差。具体来说就是PHP4的面向对象性能很弱,因此习惯了使用Java或C#的技术人员都对此有很多的抱怨。 逐步改善PHP4的面向对象的性能,大幅度的更改基本文法,开发者达成了更新PHP记述方法的开拓目的。关键的OOP概念 PHP5的新特性 对象的参照过渡是默认的 例如: $obj = new Something; 上面的语句可以分为两部分来理解:右边的是第一步:在内存中分配空间;左边的是第二步,$obj是一个对象引用,它是一个指针,指向第一步在内存中分配过的空间地址。而不是将右边的内存中的空间复制给$obj.引用了访问属性的限制引

25、用了访问方法的限制抽象类和抽象方法接口Final声明名空间类内常量类变量统一的构造函数析构函数关键的OOP概念 对象的引用在PHP4中,在以变量$var1为类的实体对象时,如果使用$var2=$var1,那么,在$var2中,$var1的复制被代入。明显的, $var2为了指向与$var1相同的对象,就要写成 $var2=&$var1,必须要加上&作为参照。在PHP5中,对象的代入将成为自动的参照过渡,也就是说, $var2=$var1,两者指向相同的对象,如果想要同PHP4一样,带入copy,那么就会运用到导入_clone()方法。 $var2=$var1-_clone();此处clone(

26、)前面是两个连续的”_” (这仅仅是类的实体的特性)关键的OOP概念封装性 封装性是面向对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:1.把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。2.信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界或者说形成一道屏障,只保留有限的对外接口使之与外部发生联系。封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效的避免了外部错误对它的交叉感染,使软件错误能够局部化,大大减少查错和排错的难度。 用个实例来说明吧,

27、假如某个人的对象中有年龄和工资等属性,像这样个人隐私的属性是不想让其它人随意就能获得到的,如果你不使用封装,那么别人想知道就能得到,但是如果你封装上之后别人就没有办法获得封装的属性,除非你自己把它说出去,否则别人没有办法得到。 再比如说,个人电脑都有一个密码,不想让其它人随意的登陆,在你的电脑里面拷贝和粘贴。还有就是像人这个对象,身高和年龄的属性,只能是自己来增涨,不可以让别人随意的赋值等等。关键的OOP概念使用private这个关键字来对属性和方法进行封装: 原来的成员: var $name; /声明人的姓名 var $sex; /声明人的性别 var $age; /声明人的年龄 funct

28、ion run().改成封装的形式: private $name; /把人的姓名使用private关键字进行封装 private $sex; /把人的性别使用private关键字进行封装 private $age; /把人的年龄使用private关键字进行封装 private function run() /把人的走路方法使用private关键字进行封装注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字“var”。 关键的OOP概念通过private就可以把人的成员(成员属性和成员方法)封装上了。封装上的成员就不能被类外面直接访问了,只有对象内部自己可以访问;下面的代码会产生错误:cl

29、ass Person/下面是人的成员属性private $name; /人的名子,被private封装上了private $sex; /人的性别, 被private封装上了private $age; /人的年龄, 被private封装上了/这个人可以说话的方法function say()echo 我的名子叫:.$this-name. 性别:.$this-sex. 我的年龄是:.$this-age.;/这个人可以走路的方法, 被private封装上了private function run()echo 这个人在走路;关键的OOP概念/实例化一个人的实例对象$p1=new Person();/试图

30、去给私有的属性赋值, 结果会发生错误$p1-name=张三;$p1-sex=男;$p1-age=20;/试图去打印私有的属性, 结果会发生错误echo $p1-name.”;echo $p1-sex.”;echo $p1-age.”/试图去打印私有的成员方法, 结果会发生错误$p1-run();输出结果为:Fatal error: Cannot access private property Person:$nameFatal error: Cannot access private property Person:$sexFatal error: Cannot access private

31、property Person:$ageFatal error: Cannot access private property Person:$nameFatal error: Call to private method Person:run() from context 关键的OOP概念从上面的实例可以看到,私有的成员是不能被外部访问的,因为私有成员只能在本对象内部自己访问,比如,$p1这个对象自己想把他的私有属性说出去,在say()这个方法里面访问了私有属性,这样是可以。(没有加任何访问控制,默认的是public的,任何地方都可以访问)/这个人可以说话的方法, 说出自己的私有属性,在这里

32、也可以访问私有方法 function say() echo “我的名字叫:.$this-name. 性别:.$this-sex. 我的年龄是:.$this-age.; /在这里也可以访问私有方法 /$this-run(); 因为成员方法say()是公有的,所以我们在类的外部调用say()方法是可以的,改变上面的代码;关键的OOP概念class Person/下面是人的成员属性private $name; /人的名子,被private封装上了private $sex; /人的性别, 被private封装上了private $age; /人的年龄, 被private封装上了/定义一个构造方法参数为

33、私有的属性姓名$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. 性别:.$

34、this-sex. 我的年龄是:.$this-age.;关键的OOP概念/通过构造方法创建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 我的名字叫:王

35、五性别:男我的年龄是:40关键的OOP概念因为构造方法是默认的公有方法(构造方法不要设置成私有的),所以在类的外面可以访问到,这样就可以使用构造方法创建对象,另外构造方法也是类里面的函数,所以可以用构造方法给私有的属性赋初值。Say()的方法是默认公有的,所以在外面也可以访问的到,说出他自己的私有属性。 从上面的例子中我们可以看到,私有的成员只能在类的内部使用,不能被类外部直接来存取,但是在类的内部是有权限访问的,所以有时候我们需要在类的外面给私有属性赋值和读取出来,也就是给类的外部提供一些可以存取的接口,上例中构造方法就是一种赋值的形式,但是构造方法只是在创建对象的时候赋值,如果我们已经有一

36、个存在的对象了,想对这个存在的对象赋值,这个时候,如果你还使用构造方法传值的形式传值,那么就创建了一个新的对象,并不是这个已存在的对象了。所以我们要对私有的属性做一些可以被外部存取的接口,目的就是可以在对象存在的情况下,改变和存取属性的值,但要注意,只有需要让外部改变的属性才这样做,不想让外面访问的属性是不做这样的接口的,这样就能达到封装的目的,所有的功能都是对象自己来完成,给外面提供尽量少的操作。关键的OOP概念如果给类外部提供接口,可以为私有属性在类外部提供设置方法和获取方法,来操作私有属性.例如 prvate $age; /私有的属性年龄function setAge($age) /为外

37、部提供一个公有设置年龄的方法if($age130) /在给属性赋值的时候,为了避免非法值设置给属性return;$this-age=$age;function getAge() /为外部提供一个公有获取年龄的方法return($this-age);上面的方法是为一个成员属性设置和获取值,当然你也可以为每个属性用同样的方法对其进行赋值和取值的操作,完成在类外部的存取工作。 关键的OOP概念_set() _get() 方法的应用 一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“_get()”和“_set

38、()”来获取和赋值其属性,以及检查属性的“_isset()”和删除属性的方法“_unset()”。 上一节中,我们为每个属性做了设置和获取的方法,在PHP5中给我们提供了专门为属性设置值和获取值的方法,“_set()”和“_get()”这两个方法,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(_construct()一样, 类里面添加了才会存在,可以按下面的方式来添加这两个方法,当然也可以按个人的风格来添加: /_get()方法用来获取私有属性private function _get($property_name)if(isset($this-$property_nam

39、e) return($this-$property_name);else return(NULL);关键的OOP概念/_set()方法用来设置私有属性 private function _set($property_name, $value) $this-$property_name = $value; _get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私有的方法,是在直接获取私有属性的时候对象自动调用的。因为私有属性已经被封装上了,是不能直接获取值的(比如:“echo

40、$p1-name”这样直接获取是错误的),但是如果你在类里面加上了这个方法,在使用“echo $p1-name”这样的语句直接获取值的时候就会自动调用_get($property_name)方法,将属性name传给参数$property_name,通过这个方法的内部执行,返回我们传入的私有属性的值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。 _set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同

41、样属性私有的已经被封装上了,如果没有_set()这个方法,是不允许的,比如:$this-name=zhangsan, 这样会出错,但是如果你在类里面加上了_set($property_name, $value)这个方法,在直接给私有属性赋值的时候,就会自动调用它,把属性比如name传给$property_name, 把要赋的值“zhangsan”传给$value,通过这个方法的执行,达到赋值的目的。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。为了不传入非法的值,还可以在这个方法给做一下判断。代码如下: 关键的OOP概念?phpclass Person/下面是人的成员属性, 都

42、是封装的私有成员private $name; /人的名子private $sex; /人的性别private $age; /人的年龄/_get()方法用来获取私有属性private function _get($property_name)echo 在直接获取私有属性值的时候,自动调用了这个_get()方法;if(isset($this-$property_name) return($this-$property_name);else return(NULL);关键的OOP概念/_set()方法用来设置私有属性 private function _set($property_name, $va

43、lue) echo 在直接设置私有属性值的时候,自动调用了这个_set()方法为私有属性赋值; $this-$property_name = $value; $p1=new Person(); /直接为私有属性赋值的操作, 会自动调用_set()方法进行赋值 $p1-name=张三; $p1-sex=男; $p1-age=20; /直接获取私有属性的值, 会自动调用_get()方法,返回成员属性的值 echo 姓名:.$p1-name.; echo 性别:.$p1-sex.; echo 年龄:.$p1-关键的OOP概念程序执行结果: 在直接设置私有属性值的时候,自动调用了这个_set()方法为

44、私有属性赋值在直接设置私有属性值的时候,自动调用了这个_set()方法为私有属性赋值在直接设置私有属性值的时候,自动调用了这个_set()方法为私有属性赋值在直接获取私有属性值的时候,自动调用了这个_get()方法姓名:张三在直接获取私有属性值的时候,自动调用了这个_get()方法性别:男在直接获取私有属性值的时候,自动调用了这个_get()方法年龄:20以上代码如果不加上_get()和_set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用_get()和_set()方法来帮助我们直接存取封装的私有成员的。 关键的OOP概念对象的成员属性设置方法总结方法举例评

45、价1类成员属性为Pulic通过类引用方式来设置数据成员 $p1-name=”张三”;2类成员属性为Private通过自动调用_set()方法 private function _set($property_name, $value) $this-$property_name = $value; $p1-name=张三;3类成员属性为Private通过构造方法传进来的变量来赋初始值 function _construct($name) $this-name=$name; $p1=new Person(“张三”);4类成员属性为Private设置方法set()来赋值function setName

46、($name) $this-name=$ name; $p1-setName(“张三”);关键的OOP概念对象的成员属性获取方法总结方法举例评价1类成员属性为Pulic通过类引用方式来获取数据成员 $p1-name;2类成员属性为Private通过自动调用_get()方法 private function _get($property_name,) return($this-$property_name); $p1-name;3类成员属性为Private设置方法 get()来获得function getName() return($this-$name); $p1-getName( );关键的

47、OOP概念类继承继承在PHP中很容易实现,只要使用extend关键字 Class Employee private $name# Define a setter for the private $name member. function setName($name) if ($name = “” ) echo “Name cannot be blank1”; else $this-name = $name; #Define a getter for the private $name memberFunction getName( ) return “My name is “.$this-n

48、ame.” ; # end Employee class#Define an Executive class that inherits from EmployeeClass Executive extends Employee#Define a method unique to Employee function pillageCompany( ) echo “Im selling company assets to finance my yacht!”; #end Executive class关键的OOP概念类继承# Creat a new Executive object$exec =

49、 new Executive ();#Call the setName() method,defined in the Employee class$exec-setName(“Richard”);#Call the getName() methodecho $exec-getName();#Call the pillageCompany() method$exec-pillageCompany();Result:My name is Richard.Im selling company assets to finance my yacht!关键的OOP概念访问的修饰符在PHP5中,同C#,J

50、AVA一样,导入了public,private,protected三个等级的访问限制,使得类的设计者,能够对属性和方法的使用方法进行限定,以下是各种访问的限制Public:可以自由的在类的内外任何地方进行参照、变更。Private:只能在类的方法中进行参照、变更。Protected:能够在这个类以及继承了这个类的另一个类的方法中进行参照、变更。另外,在继承的类中,能够写入访问指定。关键的OOP概念访问的修饰符Class Hoge1Private $var1;Protected $var2=B;Protected $var3; Function setLower ( ) $this-var1=a

51、; $this-var2=b; $this-var3=c; Function var1Return $this-var1; Function var2Return $this-var2; Function var2Return $this-var2; 关键的OOP概念访问的修饰符在这个类中,带有$var1、$var2、$var3三个属性,其中$var1是private,$var2、$var3是protected.在此处PHP代码-$hoge = new Hoge1();Echo “var1” .$hoge-var1. “n”;-如果尝试访问不允许从外部访问的private属性,就会出现错误:F

52、atal error: Cannot access private property Person:$ var1;对于protected 的$var2,$var3也是一样。关键的OOP概念访问的修饰符但是因为$hoge的方法是没有private和protected的,所以下面的代码能够正常运行,返回内部私有和保护变量的值。PHP代码-$hoge-setLower();Echo var1: . $hoge-var1. “n”;Echo var2: . $hoge-var2. “n”;Echo var3: . $hoge-var3. “n”;Result:var1: avar2: bvar3: c

53、关键的OOP概念访问的修饰符其次,为了能够看到protected的属性的状态,我们试着创造了继承了Hoge1的类Hoge2.PHP代码-Class Hoge2 extend Hoge1 Public $var3=3; function d_var1( ) return $this-var1; function d_var2( ) return $this-var2; function d_var3( ) return $this-var3; # end Executive class-关键的OOP概念访问的修饰符在类Hoge2中,只有$var3被声明为public。在属性是protected的

54、情况下,从子类进行访问有何种限制,是由子类的属性声明决定的。在Hoge2中,因为$var3被声明是public,因此无论是从何处都可以访问Hoge2的$var3(实体是Hoge1的$var3).因为$var1在Hoge1中是private,因此,在Hoge2子类中Hoge1的$var1不会被继承,而在Hoge2中有可能会做出名为$var1的属性,因此,必须要明确区分Hoge1:$var1和Hoge2:$var1.PHP代码-$hoge = new Hoge2.echo var1: . $hoge-var1 .n; /var1:/ echo var2: . $hoge-var2 .n; /Err

55、orecho var3: . $hoge-var3 .n; /var3:3echo var1: . $hoge-d_var1() .“n”; /var1:echo var2: . $hoge-d_var2() .“n”; /var2:Becho var3: . $hoge-d_var3() .n; /var3:3-$hoge-var1是与Hoge1:var1没有关系的变量,因此不会有任何显示,因为var2有protected访问限制,所以如果不通过method就直接访问$var2,就会出现致命错误。 关键的OOP概念访问的修饰符与上述相同,此处也分为private,public,protected三种。Public:能够从任何地方调用Private:只能从这个类的method内调用Protected:只能从这个类以及subclass的met

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论