PHP5类实例教程.doc

上传人:scccc 文档编号:13890630 上传时间:2022-01-25 格式:DOC 页数:47 大小:616KB
返回 下载 相关 举报
PHP5类实例教程.doc_第1页
第1页 / 共47页
PHP5类实例教程.doc_第2页
第2页 / 共47页
PHP5类实例教程.doc_第3页
第3页 / 共47页
PHP5类实例教程.doc_第4页
第4页 / 共47页
PHP5类实例教程.doc_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《PHP5类实例教程.doc》由会员分享,可在线阅读,更多相关《PHP5类实例教程.doc(47页珍藏版)》请在三一文库上搜索。

1、201009/14Alac ner ZhangPHP类实例教程PHPer开始希望这个介绍PHP5面向对象编程(OOP)的资料能让初学者受益,能让更多的 转向OOP的编程过程。目录开始 2类和对象的基础部分 2PHP5类中的属性3PHP5类中的方法5对象的比较 7构造函数 9类的继承 10访问控制 private, protected, public 12类的重写( override ) 14类中 this 关键字 15类中 parent: 关键字 18Static 的用法 20设计模式之单件模式 25final 类、 final 方法和常量 29PHP5中的常量 30abstract 类和 a

2、bstract 方法 32设计模式之模版模式 37PHP类接口的定义与规范 38PHP类接口的实现接口 40PHP类接口的继承 43类型提示 44PHP抽象类实现接口 471开始从OOP (面向对象)的视角看,不应区分语言。无论是C+、无论是Java无论是.net还有更多面向对象的语言,只要你了解了OOP的真谛,便可以跨越语言,让你的思想轻松的跳跃。便没有对于 Java、 .net 、 PHP 之间谁强谁弱的争执了。希望这个介绍PHP5面向对象编程(OOP)的资料能让初学者受益,能让更多的PHPer开始转向OOP的编程过程。相对PHP4, PHP5在面向对象方面改变了很多。我们将只介绍PHP5

3、环境下的面向对象。而我们必须改变自己来跟随 PHP5的发展。如果代码结果在你的环境下执行不一致,请确认你 的环境为 PHP5。我们假设读者没有任何面向对象的知识,即使你是第一次听说OOP,也可以读懂这文章。但我希望你必须对 PHP有一些了解。在后面我们将使用一些例子,来逐渐分析PHP5的OOP基础。面向对象只解决了两个问题,代码的可扩展性、代码的可维护性。下一节我们将学习类和对象基础部分类和对象的基础部分Everything is Object :万事万物皆对象面向对象的编程(OOP)思想力图使对计算机语言中对事物的描述与现实世界中该事物的本 来面目尽可能的一致。 (面向对象语言与我们的生活是

4、相通的,面向对象语言学习起来其实 很简单。在应用中更符合我们的生活逻辑。 )Class/Object :类(class)和对象(object)是面向对象方法的核心概念。类是对一类事物描述,是抽象的、概念上的定义;(类好像是在图纸上设计的楼房,楼房设计出来了,但这个楼房并不存在。)对象是实际存在的该类事物的每个个体,因而也称实例 (instance)。(对象是实实在在存在的, 照着楼房的设计图纸, 高楼盖起来, 可以住进去了。 在计算机中, 可以理解为,在内存中创建了实实在在存在的一个内存区域存储着这个对象。) 创建对象的过程称为创建对象也称为实例化。看下面的图示,一张楼房的图纸创建了多个别墅(

5、对象) 思考一下:它们外观一样么?它们结构一样么?它们是一个对象么?PHP5中的类和对象我们先建立一个基础的类。PHP中使用关键字 class来定义一个类。类的命名一般使用首字符大写,而后每个单词首字符大写连接的方式方便阅读。这样,我们就拥有了第一个 PHP类。我们继续来使用这个类,使用 new 这个关键字创建对象$p = new Person();也可以写成$p = new Person;但不建议使用后面的这种方式。PHP5 类中的属性属性:用来描述对象的数据元素称为对象的属性(也称为数据/状态),在PHP5中,属性指在class中声明的变量。在声明变量时,必须使用public privat

6、e protected之一进行修饰,定义变量的访问权限。 ( public private protected 三者的区别将在以后讲解) 属性的使用:通过引用变量的 -符号调用变量指向对象的属性。 在方法内部通过 $this- 符号调用同一对象的属性。name; / 输出对象 $p 的属性 $nameecho ;echo . $p-age; / 输出 $age 属性?我们还可以改变属性的值,当然要注意的改变属性的值是通过 public 来修饰的 我们修改一下这个例子:name = Tom; / 我是 Tom$p-age = 25 ; / 年龄 25echo . $p-name; / 输出名字e

7、cho ;echo . $p-age; / 年龄?创建一个 Person 的对象,改变这个对象的属性。为它命名,查看它的名字。你就是机器里 面这个 Person 对象的上帝,按照你定义的规则,这个实实在在内存中的Person 对象被创建了,而且它有了可以改变的属性。属性的初值 在 PHP5 中,在属性定义可以不设置初值,或者赋予以下红色类型的初值。PHP中简单类型有8种,分别是:四种标量类型: 布尔型( boolean )整型( integer )浮点型( float )(浮点数,也作“ double ”)字符串( string )两种复合类型:数组( array)对象( object )最后

8、是两种特殊类型:资源( resource)NULLPHP5 类中的方法方法:对对象的属性进行的操作称为对象的方法(也称为行为 / 操作)。过程函数方法 过程:过程是编制程序时定义的一个语句序列,用来完成某种指定的操作。函数:函数有返回值,也是定义的语句序列。方法:在面向对象概念中,类里面的一段语句序列。一般来说,在面向对象概念中,函数和方法两个名词是通用的。通过方法读取属性下面的例子将属性设置为 private ,同时声明了 public 的 getName() 方法,用来获取属性 $name 的值,调用 getName() 方法就会通过 return $this-name 返回 $name

9、的值。name;$newperson = new Person();echo . $newperson-getName();?注意:这里,方法内部调用本地属性时,使用 $this-name 来获取属性。在这个例子中,设 置了公开的 getName() 方法,即用户只能获取 $name, 而无法改变他的值。这就是封装的好 处。封装指的是将对象的状态信息(属性)和行为(方法)捆绑为一个逻辑单元的机制。PHP5 中通过将数据封装、声明为私有的(private) ,再提供一个或多个公开的( public )方法实现对该属性的操作,以实现下述目的:防止对封装数据的未经授权的访问。 使用者只能通过事先定制

10、好的方法来访问数据, 可以便 地加入控制逻辑,限制对属性的不合理操作;有利于保证数据的完整性; 便于修改,增强代码的可维护性; 方法的参数通过方法定义时的参数,可以向方法内部传递变量。如下第 5 行,定义方法时定义了方法参数 $_a 。使用这个方法时,可以向方法内传递参数变 量。方法内接受到的变量是局部变量, 仅在方法内部有效。 可以通过向属性传递变量值的方 式,让这个变量应用于整个对象。a = $_a;function getA() return $this-a;$newperson = new Person();$newperson-setA(100);echo $newperson-ge

11、tA();?如果声明这个方法有参数, 而调用这个方法时没有传递参数, 或者参数数量不足, 系统会报 出错误。如果参数数量超过方法定义参数的数量,PHP就忽略多于的参数,不会报错。可以在函数定义时为参数设定默认值。 在调用方法时, 如果没有传递参数, 将使用默认值填充这 个参数变量。a = $_a;function getA() return $this-a;$a1 = new A();$p = new Person();$p-setA($a1);echo $p-getA()-name; ?再次提示在PHP5中,指向对象的变量是引用变量。 在这个变量里面存储的是所指向对象的内存地址。 引用变量传

12、值时, 传递的是这个对象的指向。 而非复制这个对象。 这与其它类型赋值有所不 同。对象的比较在PHP中有=赋值符号、=等于符号和=全等于符号,这些符号代表什么意思?当使 用比较操作符( =)时,对象以一种很简单的规则比较:当两个对象有相同的属性和值,属 于同一个类且被定义在相同的命名空间中, 则两个对象相等。 等于符号比较对象时, 比较对 象是否有相同的属性和值。注意: = 比较两个不同的对象的时候,可能相等也可能不等。?php class Person public $name = NickName;/ 分别创建两个对象$p = new Person();$p1 = new Person()

13、;/ 比较对象if ($p = $p1) echo $p 和 $p1 内容一致 ; else echo $p 和 $p1 内容不一致 echo ;$p-name = Tom;if ($p = $p1) echo $p 和 $p1 内容一致 ; else echo $p 和 $p1 内容不一致 ?使用 = 符号比较两个对象, 比较的仅仅是两个对象的内容是否一致。 当使用全等符 ( =) 时,当且仅当两个对象指向相同类(在某一特定的命名空间中)的同一个对象时才相等。是 否在是同一个对象,两边指向的对象是否有同样的内存地址。?phpclass Personpublic $name = NickNam

14、e;/ 分别创建两个对象$p = new Person();$p1 = new Person();/ 比较两个对象if ($p = $p1) echo $p 和 $p1 是一个对象 ; else echo $p 和 $p1 不是一个对象 echo ;$p-name = Tom;if ($p = $p1) echo $p 和 $p1 是一个对象 ; else echo $p 和 $p1 不是一个对象 ?结果 = 比较的是两个变量是否一个对象。一个等于符号( =)表示赋值,是赋值计算。如果将对象赋予变量,是指变量将指向这个对 象。?phpclass Personpublic $name = Nic

15、kName;$p = new Person();$p1 = new Person();$p2 = $p1; /变量$p2指向$p1指向的对象if ($p2 = $p1) echo $p2和$p1指向一个对象; else echo $p2和$p1不指向一个对象;echo ;$p = $p1; /变量$p指向$p1指向的对象if ($p = $p1) echo $p 和 $p1 指向一个对象 ; else echo $p2和$p1不指向一个对象;?构造函数构造方法又称为构造函数,是对象被创建时自动调用的方法,用来完成类初始化的工作。构造函数和其它函数一样,可以传递参数,可以设定参数默认值。构造函数

16、可以调用属性, 可以调用方法。构造函数可以被其它方法显式调用。在 PHP4 中使用与类名同名的方法为构造函数。在 PHP5 中依然支持了这种方式,但不建议 再使用这种方式。name = $name;echo 在类被初始化的时候,这里的代码将会运行;echo $name is $this-name ;new Person(tom);new Person(jack); ?类的继承继承是面向对象最重要的特点之一,就是可以实现对类的复用。通过“继承”一个现有的类,可以使用已经定义的类中的方法和属性。继承而产生的类叫做子类。被继承的类,叫做父类,也被成为超类。PHP是单继承的,一个类只可以继承一个父类,

17、但一个父类却可以被多个子类所继承。从子类的角度看,它继承(inherit , extends)”自父类;而从父类的角度看,它派生 (derive )”子类。它们指的都是同一个动作,只是角度不同而已。子类不能继承父类的私有属性和私有方法。在PHP5中类的方法可以被继承,类的构造函数也能被继承。继承的简单例子我们分析自然界中的关系,动物类与犬类的关系。weight;public function setWeight($W) $this-weight = $W;class Dog extends Animal?当我们实例化 animal 类的子类 Dog 类时,父类的方法 setWeight() 和

18、 getWeight() 被继承。我们可以直接调用父类的方法设置其属性 $weight ,取得其属性 $weight 。 setWeight(20);echo Mydogs weight is . $myDog-getWeight() . ;$myDog-Bark();?构造函数的继承有些资料上说 PHP5 的构造函数不被继承。演示的结果证明,PHP5 的构造函数被继承了。当子类 Dog1 被实例化时, 继承的构造函数被调用了, 屏幕上显示了一句 “I am an Animal.”。legNum = 4;echo I am an animal ;class Dog1 extends Anima

19、l$dog1 = new Dog1();echo ;echo legNum is . $dog1-legNum;/*实例化子类时,构造函数被调用了。*/?私有变量和方法不被继承访问控制 private, protected, public在 PHP5 中,可以在类的属性和方法前面加上一个修饰符(modifier ),来对类进行一些访问上的控制。Public (公开):可以自由的在类的内部外部读取、修改。Private (私有):只能在这个当前类的内部读取、修改。Protected (受保护) :能够在这个类和类的子类中读取和修改。Private 的访问权限private 不能直接被外部调用,只

20、能由当前对象调用。前面介绍过关于封装的内容这里不再重复。 比如你可以借钱给别人, 但不希望别人知道你钱包里面有多少钱。 我们把它用 private 隐藏起来。mymoney = $num) $this-mymoney = $this-mymoney - $num;echo 好的,这里借给你 $num 元,可是我也不多了。 ; else echo 我无法借 $num 元给你,我没有这么多钱。 ;$mon = new Money();$mon-loan(300);$mon-loan(600);$mon-loan(400);echo $mon-mymoney;/ 这个地方会抛出异常,私有变量不能被外

21、界访问?Protected 的访问权限protected 修饰的属性和方法只能被子类调用。外界无法调用。mymoney = $num) $this-mymoney = $this-mymoney - $num;echo 好的,这里借给你 $num 元,可是我也不多了。 ; else echo 我无法借 $num 元给你,我没有这么多钱。 ;class SMoney extends Money public function getMoney() return $this-mymoney;$mon = new SMoney();$mon-loan(900); / 借钱echo 老婆,这里我还有

22、. . $mon-getMoney() . 元 ; / 其他人不允许访问, ?Public 修饰的属性和方法,可以被无Public 的访问权限 数据的隐藏和封装是能够帮助我们保护数据的安全性。 限制的调用。嘿。 。你的钱,不安全了。mymoney = $num) $this-mymoney = $this-mymoney - $num;echo 好的,这里借给你 $num 元,可是我也不多了。 ; else echo 我无法借 $num 元给你,我没有这么多钱。 ;$mon = new Money(); $mon-mymoney = $mon-mymoney - 5000;echo 我现在只有

23、 . $mon-mymoney;echo 钱哪里去了,我也不知道。 ;?类的重写( override )如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖( override ),也称为方法的重写。 当对父类的方法进行重写时,子类中的方法必须和父类中对应的方法具有相同的方法名称, 在PHP5中不限制输入参数类型、参数数量和返回值类型。(这点和JAVA不同)子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。 声明方法时,如果不定义访问权限。默认权限为public 。先设置一个父类,这个父类是Dog”类,这个类描述了 dog的特性。Dog有2个眼睛,会跑,会叫

24、。就这样描述先。我养了一直狗,是只小狗,符合Dog 类的特性,但有所不同。我的小狗有名字,我的小狗太小了, 不会大声的叫,只会哼哼。我们用继承的概念去实现这 个设计。eyeNumber;/ 狗会叫public function yaff() return Dog yaff, wang .wang .;/ 狗会跑public function run() return Dog run.running .;$dog = new Dog();echo dog have . $dog-getEyeNumber() . eyes. ;echo $dog-yaff() . . $dog-run();ech

25、o ;/ 这是我的小狗,叫 狗狗 ,他还小不会汪汪叫,智慧哼哼。class MyDog extends Dogprivate $name = ;public function getName() return $this-name;public function yaff() return $this-name . yaff, heng.heng .;$myDog = new MyDog();echo $myDog-getName() . have . $myDog-getEyeNumber() . eyes. ; echo $myDog-yaff() . . $myDog-run();?重写

26、方法与访问权限 子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。类中 this 关键字PHP5中为解决变量的命名冲突和不确定性问题,引入关键字“$this”代表其所在当前对象。$this 在构造函数中指该构造函数所创建的新对象。在类中使用当前对象的属性和方法,必须使用$this-取值。方法内的局部变量,不属于对象,不使用 $this 关键字取值。局部变量和全局变量与 $this 关键字 ,使用当前对象的属性必须使用$this 关键字。局部变量的只在当前对象的方法内有效,所以直接使用。注意:局部变量和属性可以同名,但用法不一样。在使用中,要尽量避免这样使用,以免混 淆。?phpcla

27、ss Aprivate $a = 99;/ 这里写一个打印参数的方法public function printInt($a) echo $a 是传递的参数 $a ;echo ;echo $this-a 是属性 $this-a;$a = new A(); / 这里的 $a 可不是类中的任何变量 $a-printInt(88);?用$this调用对象中的其它方法 $b ? $a : $b;/ 三个数值比较大小public function Max3($a, $b, $c) $a = $this-Max($a, $b);/ 调用类中的其它方法return $this-Max($a, $c);$mat

28、h = new Math(); echo 最大值是 . $math-Max3(99, 100, 88);?使用 $this 调用构造函数 调用构造函数和析构函数的方法一致。a = $this-a + 1;public function doSomeThing() $this-_construct(); return $this-a;$a = new A(); / 这里的 $a 可不是类中的任何一个变量了 echo 现在 $a 的值是 . $a-doSomeThing();?$this 到底指的什么?$this。$this 就是指当前对象,我们甚至可以返回这个对象使用getASelf();/ 调

29、用方法返回当前实例echo $a; / 打印对象会调用它的 _toString 方法 ?通过 $this 传递对象在这个例子中 ,我们写一个根据不同的年龄发不同工资的类。我们设置处理年龄和工资的业 务模型为一个独立的类。payoff = new Payoff();public function getAge() return $this-age;public function setAge($age) $this-age = $age;/ 获得工资public function getSal() $this-sal = $this-payoff-figure($this);return $th

30、is-sal;/ 这是对应工资与年龄关系的类 .class Payoffpublic function figure($a) $sal =0;$age = $a-getAge();if ($age 80 | $age 50) $sal = 1000; else $sal = 800;return $sal;/ 实例化 User$user = new User();$user-setAge(55);echo $user-getAge() . age, his sal is . $user-getSal(); echo ;$user-setAge(20);echo $user-getAge() .

31、 age, his sal is . $user-getSal(); echo ;$user-setAge(-20);echo $user-getAge() . age, his sal is . $user-getSal(); echo ;$user-setAge(150);echo $user-getAge() . age, his sal is . $user-getSal(); ?类中 parent: 关键字PHP5 中使用 parent: 来引用父类的方法。 parent: 可用于调用父类中定义的成员方法。 parent: 的追溯不仅于直接父类。通过 parent: 调用父类方法sa

32、l = $this-sal + 1200; return $this-sal ;class Manager extends employee/ 如果想让经理在员工工资的基础上多发 1500 元/必须先调用父类的getSal()方法public function getSal() parent:getSal(); / 这里调用了父类的方法 $this-sal = $this-sal + 1500; return $this-sal ;$emp = new employee();echo 普通员工的工资是 . $emp-getSal();echo ;$manager = new Manager()

33、;echo 经理的工资是 : . $manager-getSal(); ?父类的 private 属性Private 属性是不能被继承的,如果父类有私有的属性。那么父类的方法只为父类的私有属 性服务。sal;class Manager extends employeeprotected $sal = 5000; public function getParentSal() / 这里返回的是父类的 private 属性 return parent:getSal();$manager = new Manager();echo PHP . phpversion() . ;echo $manager-

34、getSal();echo ;echo parents $sal . $manager-getParentSal(); ?如果父类中的属性被子类重写了。注意第 5 行的属性定义变成 protected 。那么两次的输出 是不一样的,如果你学过java,你会觉得这一切都是很难理解的。在Java中当子类被创建时,父类的属性和方法在内存中都被创建,甚至构造函数也要被调用。PHP5不是这样,PHP5调用父类用的是 pare nt:而不是paren t-,这足以说明PHP5不想在内存中让父类也被创建。 PHP5想让继承变的比Java更简单。适应下就好。Static 的用法static 关键字用来修饰属性

35、、方法,称这些属性、方法为静态属性、静态方法。static 关键字声明一个属性或方法是和类相关的, 而不是和类的某个特定的实例相关, 因此, 这类属性或方法也称为“类属性”或“类方法”如果访问控制权限允许,可不必创建该类对象而直接使用类名加两个冒号“:”调用。static 关键字可以用来修饰变量、方法。不经过实例化,就可以直接访问类中 static 的属性和 static 的方法。static 的属性和方法,只能访问 static 的属性和方法,不能类访问非静态的属性和方法。因 为静态属性和方法被创建时,可能还没有任何这个类的实例可以被调用。static 的属性,在内存中只有一份,为所有的实例共用。使用 self: 关键字访问当前类的静态成员。一个类的所有实例,共用类中的静态属性。也就是说,在内存中即使有多个实例,静态的属性也只有一份。下面例子中的设置了一个计数器 $count 属性,设置 private 和 static 修饰。这样,外界并不能直接访问 $count 属性。而程序运行的结果我们也看到多个实例在使用同 一个静态的 $count 属性。getCount() . user;echo ;unset($user3);echo now here have . $user1-getCount()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1