PHP面向对象程序设计.ppt

上传人:鲁** 文档编号:569744421 上传时间:2024-07-30 格式:PPT 页数:33 大小:594.31KB
返回 下载 相关 举报
PHP面向对象程序设计.ppt_第1页
第1页 / 共33页
PHP面向对象程序设计.ppt_第2页
第2页 / 共33页
PHP面向对象程序设计.ppt_第3页
第3页 / 共33页
PHP面向对象程序设计.ppt_第4页
第4页 / 共33页
PHP面向对象程序设计.ppt_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《PHP面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《PHP面向对象程序设计.ppt(33页珍藏版)》请在金锄头文库上搜索。

1、第第6章章 PHP面向对象程序设计面向对象程序设计6 . 1 基基 本本 概概 念念6 . 2 PHP中的类中的类6 . 3 类类 的的 继继 承承6 . 4 抽象类与接口抽象类与接口6 . 5 类的魔术方法类的魔术方法6 . 6 类型判断与引用类型判断与引用6 . 7 实例实例设计一个学生管理类设计一个学生管理类6 . 1 基基 本本 概概 念念1封装封装封装是将数据和代码捆绑到一起,避免外界的干扰和不确定性。在PHP中,封装是通过类来实现的。类是抽象数据类型的实现,一个类的所有对象都具有相同的数据结构,并且共享相同的实现操作的代码,而各个对象又有着各自不同的状态,即私有的存储。因此,类是所

2、有对象的共同的行为和不同状态的结合体。2继承继承类提供了创建新类的一种方法,再借助于“继承”这一重要机制扩充了类的定义,实现了面向对象的优越性。继承提供了创建新类的方法,这种方法就是,一个新类可以通过对已有的类进行修改或扩充来满足新类的需求。新类共享已有类的行为,而自己还具有修改的或额外添加的行为。因此,可以说继承的本质特征是行为共享。3多态多态不同的类对于不同的操作具有不同的行为,称为多态。多态机制使具有不同的内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。6 . 2 PHP中的类中的类6.2.1 创建类创建类类是面向对象程序设计的核心,它是一种数据类型。类由变量和函数组

3、成,在类里面,变量称为属性或成员变量,函数称为方法。定义类的语法格式如下:classclassnamevar$property=value;functionfunctionname($args)/代码6.2.1 创建类创建类自PHP5.5起,关键字class也可用于类名的解析。使用classname:class可以获取一个字符串,包含了类classname的完全限定名称。这对使用了命名空间的类尤为有用。例如:以上程序会输出:NSclassname6.2.2 类的属性和方法类的属性和方法在类中,使用关键字var来声明变量,即类的属性。使用关键字function来定义函数,即类的方法。例如,以下是

4、一个简单的类定义:classavar$a=helloworld;functionfun($b)echohelloworld;6.2.2 类的属性和方法类的属性和方法自PHP5.3.0起,新增对nowdoc(详见第3.2.3节)的支持,即可以使用nowdoc初始化属性,例如:classavar$a=EOThelloworldEOT;不能将类的定义放到多个文件或多个PHP块中,例如,以下的做法是错误的:var$tmp;6.2.3 类的实例化类的实例化在声明一个类后,类只存在于文件中,程序不能直接调用。需要创建一个对象后程序才能使用,创建一个类对象的过程叫做类的实例化。类的实例化使用new关键字,关

5、键字后面需要指定实例化的类名,例如,定义一个Ctest类并实例化:stunumber=$str;/使用$this指针引用类内部的属性echo$this-stunumber;$obj=newCtest;/创建Ctest类的一个对象$obj?在实例化一个类时,有些类允许在实例化时接收参数,如果能够接收参数,可以使用以下代码创建对象,其中$args是所带参数:$obj=newCtest($args,);6.2.4 类的访问类的访问在对象被创建之后,可以在类的外部对该类的属性和方法进行访问,访问的方法是在该类对象后面使用“-”符号加上要访问的属性和方法。例如,创建了对象“$obj”,类中有属性“$st

6、unumber”,要访问该属性可以使用“$obj-stunumber”,注意属性的前面没有“$”。例如,访问Ctest类的属性和方法:$obj-stunumber=081102;/给类属性$stunumber赋值echo$obj-stunumber;/输出081102$obj-add(081101);/输出0811016.2.4 类的访问类的访问在PHP5中,引入了访问修饰符public、private和protected。它们可以控制属性和方法的可见性,通常放置在属性和方法的声明之前。public。声明为公用的属性和方法,可以在类的外部或内部进行访问。public是默认选项,如果没有为一个属

7、性或方法指定修饰符,那么它将是public的。private。声明为私有的属性和方法,只可以在类的内部进行访问。私有的属性和方法将不会被继承。protected。声明为被保护的属性和方法,只可以在类的内部和子类的内部进行访问。6.2.4 类的访问类的访问说明:说明:为了向后兼容PHP4,PHP5声明属性依然可以直接使用关键字var来替代(或者附加于)public、private或protected,但是已不再需要var了。从PHP5.0到5.1.3,var一度曾被认为是废弃的,且抛出E_STRICT警告,但是PHP5.1.3之后它不再认为是废弃的,也不会抛出警告。如果直接使用var声明属性,而

8、没有用public、private或protected之一,PHP5会将其视为public。例如:number=081101;echo$object-number;/输出081101$object-Stuinfo();/输出学生信息$object-phone=84565879;/本语句出错,访问权限不够?6.2.5 静态属性和方法静态属性和方法访问静态属性和方法时需要使用到范围解析符“:”,格式如下:classname:$attribute;/访问静态属性classname:Cfunction($args,);/访问静态方法例如:6.2.6 构造函数和析构函数构造函数和析构函数构造函数。在PH

9、P4中,在类的内部与类同名的函数都被认为是构造函数,在创建类的对象时被自动执行。而在PHP5中,构造函数的名称为_construct,“construct”的前面是两根下画线。析构函数。类的析构函数的名称是_destruct,如果在类中声明了_destruct函数,PHP将在对象被销毁前调用析构函数将对象从内存中销毁,节省服务器资源。例如:6 . 3 类类 的的 继继 承承6.3.1 子类访问父类子类访问父类在PHP中,允许通过继承其他类的方法来调用这些类里已经定义好的属性和方法,PHP不支持多继承,所以一个子类只能继承一个父类。可以使用extends关键字来指明类与类之间的继承关系。例如,以

10、下是类B继承类A的代码。6.3.2 方法重载方法重载方法的重载是指在一个类中可以定义多个拥有相同名称的方法,通过参数个数和类型来区分这些方法,而PHP目前并不支持这一特性。但可以通过类的继承,在子类中定义和父类中相同名称的方法来实现类似于方法重载的特性。例如:上述代码中,类B重载了类A的属性$attribute和方法func(),但类A的初始定义不会改变,例如,在以上代码的最后添加如下两行:$a=newA;$a-func();/输出父类A6.3.3 使用使用final关键字关键字PHP5引入了final关键字,在声明类时使用这个关键字,将使这个类不能被继承。例如,定义一个类A:finalcla

11、ssA/.如果类B尝试继承类A,将会提示以下错误:Fatalerror:ClassBmaynotinheritfromfinalclass(A)另外,如果将final关键字用于声明类中的方法,该方法将不能在任何子类中重载。6.3.4 Traits机制机制Traits和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Traits不能通过它自身来实例化。它为传统继承增加了水平特性的组合。例如:sayHello();?6 . 4 抽象类与接口抽象类与接口6.4.1 抽象类抽象类抽象类也是PHP5引入的新特性,它是一种特殊的类,使用关键字abstract来定义,不能被实例化。一个抽象类中至少包含

12、一个抽象方法,抽象方法也是由abstract关键字来定义的。抽象方法只提供了方法的声明,不提供方法的具体实现。例如:abstractfunctionfunc($name,$number);包含抽象方法的类必须是抽象类。抽象类不能用于创建对象,所以只能通过继承来使用。继承抽象类的子类,必须重载抽象类中的所有抽象方法才能被实例化。例如。6.4.2 接口接口1接口的概念接口的概念PHP只能进行单继承,即一个类只能有一个父类。为了解决这个问题,PHP5引入了接口的概念,接口是一个特殊的抽象类,使用interface关键字取代class关键字来定义。抽象类中允许存在非抽象的方法和属性,而在接口中定义的方

13、法都是抽象方法。在接口中不能使用属性,但可以使用const关键字定义的常量。例如:constcon=tom;接口的定义方法和定义类的方法类似,在接口中定义抽象方法不使用abstract关键字。例如:6.4.2 接口接口接口和类一样,也支持继承,接口之间的继承也使用extends关键字。例如:6.4.2 接口接口2接口的实现接口的实现定义了接口之后可以将其实例化,接口的实例化称为接口的实现。要实现一个接口需要一个子类来实现接口的所有抽象方法。定义接口的子类使用implements关键字,另外,一个子类还可以实现多个接口,这样就解决了多继承的问题。例如。一个子类还可以同时继承一个父类和多个接口,例

14、如,假设类base和上面代码中的接口已经创建,创建一个子类继承它们可以使用如下代码:classtestextendsbaseimplementsTeacher,Stu/类内容省略6 . 5 类的魔术方法类的魔术方法6.5.1 克隆对象克隆对象PHP使用clone关键字建立一个与原对象拥有相同属性和方法的对象,这种方法用于通过一个类实例化两个类似对象的情况下。例如:$new_obj=clone$old_obj;$new_obj是新的对象名,$old_obj是要克隆的对象名。6.5.1 克隆对象克隆对象克隆后的对象拥有克隆对象的全部属性,如果需要改变这些属性,可以使用PHP提供的魔术方法_clon

15、e。这个方法在克隆一个对象时将被自动调用,类似于_construct和_destruct方法。在_clone方法中,可以定义确切的复制行为或执行一些操作。例如:id=$this-id+1;$c1=newCid;$c2=clone$c1;echo$c1-id;/输出1echo$c2-id;/输出2?6.5.2 方法重载方法重载PHP5中有一个魔术方法_call,该方法可以用于实现方法的重载。_call方法必须有两个参数。第一个参数包含被调用的方法名称,第二个参数包含传递给该方法的参数数组。_call方法在类中的方法被访问时被调用。例如。6.5.3 属性重载属性重载通常情况下,从类的外部直接访问类

16、的属性是不建议使用的方法。若一定要这么做,可以通过PHP的“属性重载”机制,使用_get和_set方法来检查和设置属性的值,这样就可以实现封装性。例如:$name;function_set($name,$value)if($name=attribute)$this-$name=$value;$a=attribute;$obj=newclassname;/初始化echo$obj-$a;/输出1$set=$obj-$a=10;/输出10echo$set;?6.5.4 字符串转换字符串转换由于类创建的对象的数据类型是对象,所以不能用print或echo语句直接输出。如果要输出对象,可以在类中定义一个

17、_toString方法,在方法中返回一个可输出的字符串。例如:foo=$foo;publicfunction_toString()return$this-foo;$class=newTestClass(Hello);echo$class;/输出Hello?6.5.5 自动加载对象自动加载对象_autoload方法用于自动加载对象,它不是一个类方法,而是一个单独的函数。如果脚本中定义了_autoload函数,当使用new关键字实例化一个没有声明的类时,这个类的名字将作为参数传递给_autoload函数,_autoload函数根据参数自动包含含有类的文件,并加载类文件中的同名类。例如:6.5.6

18、对象序列化对象序列化对象序列化是指将一个对象转换成字节流的形式,将序列化后的对象在一个文件或网络上传输,然后再反序列化还原为原数据。对象序列化使用serialize()函数,反序列化使用unserialize()函数。在对象序列化时,如果存在魔术方法_sleep,PHP会调用_sleep方法,主要用于清除如数据提交、关闭数据库链接等工作,并返回一个数组,该数组包含需要序列化的所有变量;在反序列化一个对象后,PHP会调用_wakeup方法,主要用于重建对象序列化时丢失的资源。这两个魔术方法都不接收参数。例如。6.5.7 对象调用对象调用当尝试以调用函数的方式调用一个对象时,_invoke方法会被

19、自动调用。例如:以上程序会输出:int5booleantrue6 . 6 类型判断与引用类型判断与引用6.6.1 对象类型的判断对象类型的判断当系统很大时,往往需要判断某个对象是否由某个类创建。这时可以使用instanceof关键字来实现。instanceof关键字是PHP5引入的,它可以检查一个对象的类型,判断一个对象是否为特定类的实例,是否继承于某个类或实现某个接口。用法如下:$varinstanceofclass_name;如果变量$var是类class_name创建的对象,则返回TRUE,否则返回FALSE。例如:6.6.2 通过变量引用类通过变量引用类自PHP5.3.0起,可以通过变

20、量来引用类(动态调用类),例如:6.6.3 引用静态调用的类引用静态调用的类举个例子说明,使用self:或者_CLASS_对当前类的静态引用,取决于定义当前方法所在的类:以上代码会输出:A。6.6.3 引用静态调用的类引用静态调用的类“后期静态绑定”使用已经预留的static关键字表示运行时最初调用的类,能够让用户在上述例子中调用test()时引用的类是B而不是A,代码如下:此时的代码输出变为:B。6 . 7 实例实例设计一个学生管理类设计一个学生管理类【例6.1】设计一个学生管理类,用于获取学生信息。新建EX6_1.php文件,输入代码。运行程序,在页面上输入学号和姓名、选择性别,单击【显示】按钮,执行结果如图6.1所示。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号