PHP面向对象程序设计.ppt_第1页
PHP面向对象程序设计.ppt_第2页
PHP面向对象程序设计.ppt_第3页
PHP面向对象程序设计.ppt_第4页
PHP面向对象程序设计.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

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 创建类 类是面向对象程序设计的核心,它是一种数据类型。类由变量和函数组成,在类里面,变量称为属性或成员变量,函数称为方法。定义类的语法格式如下: class class

3、name var $property= value; function functionname($args) /代码 ,6.2.1 创建类,自 PHP 5.5 起,关键字 class 也可用于类名的解析。使用classname:class 可以获取一个字符串,包含了类classname的完全限定名称。这对使用了命名空间的类尤为有用。例如: 以上程序会输出: NSclassname,6.2.2 类的属性和方法,在类中,使用关键字var来声明变量,即类的属性。使用关键字function来定义函数,即类的方法。例如,以下是一个简单的类定义: class a var $a=hello world;

4、function fun($b) echo hello world; ,6.2.2 类的属性和方法,自PHP 5.3.0起,新增对nowdoc(详见第3.2.3节)的支持,即可以使用nowdoc初始化属性,例如: class a var $a= var $tmp; ,6.2.3 类的实例化,在声明一个类后,类只存在于文件中,程序不能直接调用。需要创建一个对象后程序才能使用,创建一个类对象的过程叫做类的实例化。类的实例化使用new关键字,关键字后面需要指定实例化的类名,例如,定义一个Ctest类并实例化: stunumber=$str; /使用$this指针引用类内部的属性 echo $this

5、-stunumber; $obj=new Ctest; /创建Ctest类的一个对象$obj ? 在实例化一个类时,有些类允许在实例化时接收参数,如果能够接收参数,可以使用以下代码创建对象,其中$args是所带参数: $obj=new Ctest($args,);,6.2.4 类的访问,在对象被创建之后,可以在类的外部对该类的属性和方法进行访问,访问的方法是在该类对象后面使用“-”符号加上要访问的属性和方法。例如,创建了对象“$obj”,类中有属性“$stunumber”,要访问该属性可以使用“$obj-stunumber”,注意属性的前面没有“$”。 例如,访问Ctest类的属性和方法: $

6、obj-stunumber=081102; /给类属性$stunumber赋值 echo $obj-stunumber; /输出081102 $obj-add(081101); /输出081101,6.2.4 类的访问,在PHP5中,引入了访问修饰符public、private和protected。它们可以控制属性和方法的可见性,通常放置在属性和方法的声明之前。 public。声明为公用的属性和方法,可以在类的外部或内部进行访问。public是默认选项,如果没有为一个属性或方法指定修饰符,那么它将是public的。 private。声明为私有的属性和方法,只可以在类的内部进行访问。私有的属性和

7、方法将不会被继承。 protected。声明为被保护的属性和方法,只可以在类的内部和子类的内部进行访问。,6.2.4 类的访问,说明:为了向后兼容PHP 4,PHP 5 声明属性依然可以直接使用关键字var来替代(或者附加于)public、private或protected,但是已不再需要var了。从PHP 5.0到5.1.3,var一度曾被认为是废弃的,且抛出E_STRICT警告,但是PHP 5.1.3之后它不再认为是废弃的,也不会抛出警告。如果直接使用var声明属性,而没有用public、private或protected之一,PHP 5 会将其视为public。例如: number=08

8、1101; echo $object-number; /输出081101 $object-Stuinfo(); /输出学生信息 $object-phone=84565879; /本语句出错,访问权限不够 ?,6.2.5 静态属性和方法,访问静态属性和方法时需要使用到范围解析符“:”,格式如下: classname:$attribute; /访问静态属性 classname:Cfunction($args,); /访问静态方法 例如: ,6.2.6 构造函数和析构函数, 构造函数。在PHP4中,在类的内部与类同名的函数都被认为是构造函数,在创建类的对象时被自动执行。而在PHP5中,构造函数的名称

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

10、类型来区分这些方法,而PHP目前并不支持这一特性。但可以通过类的继承,在子类中定义和父类中相同名称的方法来实现类似于方法重载的特性。例如: 上述代码中,类B重载了类A的属性$attribute和方法func(),但类A的初始定义不会改变,例如,在以上代码的最后添加如下两行: $a=new A; $a- func(); /输出父类A,6.3.3 使用final关键字,PHP5引入了final关键字,在声明类时使用这个关键字,将使这个类不能被继承。例如,定义一个类A: final class A /. 如果类B尝试继承类A,将会提示以下错误: Fatal error: Class B may no

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

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

13、onst con=tom; 接口的定义方法和定义类的方法类似,在接口中定义抽象方法不使用abstract关键字。例如: ,6.4.2 接口,接口和类一样,也支持继承,接口之间的继承也使用extends关键字。例如: ,6.4.2 接口,2接口的实现 定义了接口之后可以将其实例化,接口的实例化称为接口的实现。要实现一个接口需要一个子类来实现接口的所有抽象方法。定义接口的子类使用implements关键字,另外,一个子类还可以实现多个接口,这样就解决了多继承的问题。例如。 一个子类还可以同时继承一个父类和多个接口,例如,假设类base和上面代码中的接口已经创建,创建一个子类继承它们可以使用如下代码

14、: class test extends base implements Teacher, Stu /类内容省略 ,6 . 5 类的魔术方法,6.5.1 克隆对象 PHP使用clone关键字建立一个与原对象拥有相同属性和方法的对象,这种方法用于通过一个类实例化两个类似对象的情况下。例如: $new_obj=clone $old_obj; $new_obj是新的对象名,$old_obj是要克隆的对象名。,6.5.1 克隆对象,克隆后的对象拥有克隆对象的全部属性,如果需要改变这些属性,可以使用PHP提供的魔术方法_clone。这个方法在克隆一个对象时将被自动调用,类似于_construct和_de

15、struct方法。在_clone方法中,可以定义确切的复制行为或执行一些操作。例如: id=$this-id+1; $c1=new Cid; $c2=clone $c1; echo $c1-id; /输出1 echo $c2-id; /输出2 ?,6.5.2 方法重载,PHP5中有一个魔术方法_call,该方法可以用于实现方法的重载。_call方法必须有两个参数。第一个参数包含被调用的方法名称,第二个参数包含传递给该方法的参数数组。_call方法在类中的方法被访问时被调用。例如。,6.5.3 属性重载,通常情况下,从类的外部直接访问类的属性是不建议使用的方法。若一定要这么做,可以通过PHP的“

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

17、返回一个可输出的字符串。例如: foo = $foo; public function _toString() return $this-foo; $class = new TestClass(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方法会被自动调用。例如: 以上程序会输出: int 5 boolean true,6 . 6 类型判断与引用,6.6.1 对象类型的判断 当系统很大时,往往需要判断某个对象是否由某个类创建。这时可以使用instanceof关键字来实现。instanceof关键字是PHP5引入的,它可以检查一个对象的类型,判断一个对象是否为特定类的实例,是否继承于某个类或实现某个接口。用法如下: $var instanceof class_name; 如果变量$var是类class_name创建的对象,则返回TRUE,否则返回FALSE。例如: ,6.6.2 通过变量引用类,自PHP 5.3.0起,可以通过变量来引用

温馨提示

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

最新文档

评论

0/150

提交评论