《第5章 PHP面向对象编程ppt课件.pptx》由会员分享,可在线阅读,更多相关《第5章 PHP面向对象编程ppt课件.pptx(64页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第5章 PHP面向对象编程PHP程序设计基础主讲 陈学平第第5 5章章 PHPPHP面向对象编程面向对象编程3 重庆电子工程职业学院PHP程序设计基础 主编 陈学平第第5 5章章 PHPPHP面向对象编程面向对象编程p本章主要介绍了本章主要介绍了PHP面向对象编程的基本概念,面向对象编程的基本概念,PHP类的继承,类的构造方法和析构方法,类的继承,类的构造方法和析构方法,PHP类的接口,访问控类的接口,访问控制和封装,静态成员和静态方法,制和封装,静态成员和静态方法,PHP 特殊方法特殊方法 _set()、_get()、_isset() 与与 _unset(),PHP的重载、抽象类、克的重载、
2、抽象类、克隆等。隆等。p学习目标学习目标p了解了解OOP的概念。的概念。p掌握掌握PHP定义类,定义类的属性和定义类方法。定义类,定义类的属性和定义类方法。p掌握掌握PHP的构造方法和析构方法。的构造方法和析构方法。p掌握掌握PHP的抽象类和接口。的抽象类和接口。p掌握掌握PHP的访问控制和封装。的访问控制和封装。p掌握掌握PHP 类的静态成员属性与静态方法。类的静态成员属性与静态方法。p掌握掌握 PHP 类常量使用方法。类常量使用方法。p掌握掌握PHP 特殊方法特殊方法 _set()、_get()、_isset() 与与 _unset()。4 重庆电子工程职业学院PHP程序设计基础 主编 陈
3、学平5.1 PHP 类与对象类与对象1. 1.基本概念基本概念p面向对象编程(面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构。面向对象程序设计)是一种计算机编程架构。OOP 的一条基的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个目标:重达到了软件工程的三个目标:重用性、灵活性和扩展性。用性、灵活性和扩展性。pPHP 在在 4.0 版本之后完善了对版本之后完善了对 OOP 的支持了。对于小型的应用,使用
4、传统的过程化编程可能更简单也更有效率。的支持了。对于小型的应用,使用传统的过程化编程可能更简单也更有效率。然而对于大型的复杂应用时,然而对于大型的复杂应用时,OOP 就是一个不得不考虑的选择。就是一个不得不考虑的选择。2. 2.类类p类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,
5、它应该有一个类名并包括属性说明和服务说明两个主要部分。务说明两个主要部分。3. 3.对象对象p对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。行操作的一组服务组成。p类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类。p关于面向对象的编程涉及的内容很广泛,本章只介绍基本的概念与在关于面向对象的编程涉及的内
6、容很广泛,本章只介绍基本的概念与在 PHP 中的应用。中的应用。5 重庆电子工程职业学院PHP程序设计基础 主编 陈学平类类p使用关键字使用关键字 class 来声明一个类,后面紧跟类的名字,主体用来声明一个类,后面紧跟类的名字,主体用 符号括起来。符号括起来。p语法:语法:pclass class_namep .pp类里面包含了属性和方法。类里面包含了属性和方法。6 重庆电子工程职业学院PHP程序设计基础 主编 陈学平属性属性p通过在类定义中使用关键字通过在类定义中使用关键字 var 来声明变量,即创建了类的属性,也叫类的成员属性。来声明变量,即创建了类的属性,也叫类的成员属性。p语法:语法
7、:pclass class_namep var $var_name;pp举个实例说明,如果定义一个举个实例说明,如果定义一个 人人 的类,那么人的的类,那么人的 姓名、年龄、性别姓名、年龄、性别 等等便可以看做等等便可以看做 人人 这个类的属性。这个类的属性。7 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.1.3 方法方法p通过在类定义中声明函数,即创建了类的方法。通过在类定义中声明函数,即创建了类的方法。p语法:语法:pclass class_namep function function_name(arg1,arg2,)p p 函数功能代码函数功能代码p p8 重庆电子工程职业
8、学院PHP程序设计基础 主编 陈学平5.1.4 类的应用类的应用p一个定义了属性和方法的类就是一个完整的类了,可以在一个类里面包含一个完整的处理逻辑。使用一个定义了属性和方法的类就是一个完整的类了,可以在一个类里面包含一个完整的处理逻辑。使用 new 关键字来实例化一个对象以便应用类里面的逻辑。可以同时实例化多个对象。关键字来实例化一个对象以便应用类里面的逻辑。可以同时实例化多个对象。p语法:语法:pobject = new class_name();p实例化一个对象后,使用实例化一个对象后,使用 - 操作符来访问对象的成员属性和方法。操作符来访问对象的成员属性和方法。p语法:语法:pobje
9、ct-var_name;pobject-function_name;p如果要在定义的类里面访问成员的属性或者方法,可以使用伪变量如果要在定义的类里面访问成员的属性或者方法,可以使用伪变量 $this 。$this 用于表示用于表示 当前对象当前对象 或或 对象本身对象本身 。1.实例实例1:类的定义及应用:类的定义及应用p实例代码如下:实例代码如下:pname.;pecho 我的年龄是:我的年龄是:.$this-age;p p /类定义结束类定义结束p/实例化一个对象实例化一个对象p$p1 = new Person();p/给给 $p1 对象属性赋值对象属性赋值p$p1-name = 张三张三
10、; p$p1-age = 20;p/调用对象中的调用对象中的 say()方法方法p$p1-say();p?p运行该实例,输出:运行该实例,输出:p我的名字叫:张三我的名字叫:张三p我的年龄是:我的年龄是:20p上面的实例演示了一个简单的基于面向对象的上面的实例演示了一个简单的基于面向对象的 PHP 应用。应用。9 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.2 PHP 类的继承类的继承 extends 关键字关键字pPHP 类的继承是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和方法,而且可以重新定义或加类的继承是指建立一个新的派生类,从一个或多个先前定义的类中继承数据
11、和方法,而且可以重新定义或加进新数据和方法,从而建立了类的层次或等级。进新数据和方法,从而建立了类的层次或等级。p将已存在的用来派生新类的类为父类,由已存在的类派生出的新类为子类。继承是面向对象的三大特性之一。将已存在的用来派生新类的类为父类,由已存在的类派生出的新类为子类。继承是面向对象的三大特性之一。p通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。且还同时拥有旧的成员。p注意:不同于注意:不同于 Java 等语言,在
12、等语言,在 PHP 中,一个类只能直接从一个类中继承数据,即单继承。中,一个类只能直接从一个类中继承数据,即单继承。p使用使用 extends 关键字来定义类的继承:关键字来定义类的继承:pclass 子类子类 extends 父类父类p10 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.2 PHP 类的继承类的继承 extends 关键字关键字1.实例实例2使用使用 extends 关键字来定义类的继承关键字来定义类的继承p实例代码如下:实例代码如下:pname.;pecho 我的年龄是:我的年龄是:.$this-age;p pp/ 类的继承类的继承pclass Student e
13、xtends Person p var $school; /学生所在学校的属性学生所在学校的属性p function study() p echo 我的名字叫:我的名字叫:.$this-name.;p echo 我正在我正在.$this-school.学习学习;p pp$t1 = new Student();p$t1-name = 张三张三;p$t1-school = 人民大学人民大学;p$t1-study();p?p运行该实例,输出:运行该实例,输出:p我的名字叫:张三我的名字叫:张三p我正在人民大学学习我正在人民大学学习p在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息
14、组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重用性。在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重用性。采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。11 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.3 PHP 构造方法构造方法 _construct()pPHP 构造方法构造方法 p_construct() 允许
15、在实例化一个类之前先执行构造方法。允许在实例化一个类之前先执行构造方法。p构造方法是类中的一个特殊方法。当使用构造方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是是 _construct() 。p在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法,不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。该方法无返回值。个方法,所以通常用它执行一些有
16、用的初始化任务。该方法无返回值。p语法:语法:pfunction _construct(arg1,arg2,.)pp .p12 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.3 PHP 构造方法构造方法 _construct()1.实例实例3:PHP构造方法构造方法 _construct()的使用的使用p实例代码如下:实例代码如下:pname=$name;p $this-age=$age;p p function say() p echo 我的名字叫:我的名字叫:.$this-name.;pecho 我的年龄是:我的年龄是:.$this-age;p pp$p1=new Person(
17、张三张三, 20);p$p1-say();p?p运行该实例,输出:运行该实例,输出:p我的名字叫:张三我的名字叫:张三p我的年龄是:我的年龄是:20p在该实例中,通过构造方法对对象属性进行初始化赋值。在该实例中,通过构造方法对对象属性进行初始化赋值。p提示提示pPHP 不会在本类的构造方法中再自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用不会在本类的构造方法中再自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent:_construct() 。13 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.4 PHP 析构方法析构方法
18、 _destruct()pPHP 析构方法析构方法 _destruct() 允许在销毁一个类之前执行执行析构方法。允许在销毁一个类之前执行执行析构方法。p析构方法析构方法 与构造方法对应的就是析构方法,析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。析构函数不能带有任何参数,其名称必须是与构造方法对应的就是析构方法,析构方法允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件、释放结果集等。析构函数不能带有任何参数,其名称必须是 _destruct() 。p语法:语法:pfunction _destruct()pp .pp在上面的实例中加入下
19、面的析构方法:在上面的实例中加入下面的析构方法:p/定义一个析构方法定义一个析构方法pfunction _destruct()pp echo 再见再见.$this-name;pp再次运行该实例,输出:再次运行该实例,输出:p我的名字叫:张三我的名字叫:张三p的年龄是:的年龄是:20p再见张三再见张三p提示提示p和构造方法一样,和构造方法一样,PHP 不会在本类中自动的调用父类的析构方法。要执行父类的析构方法,必须在子类的析构方法体中手动调用不会在本类中自动的调用父类的析构方法。要执行父类的析构方法,必须在子类的析构方法体中手动调用 parent:_destruct() 。p试图在析构函数中抛出
20、一个异常会导致致命错误。试图在析构函数中抛出一个异常会导致致命错误。p在在 PHP4 版本中,构造方法的名称必须与类名相同,且没有析构方法。版本中,构造方法的名称必须与类名相同,且没有析构方法。p5.5 PHP final 关键字关键字pfinal 关键字。关键字。final 关键字用于定义类和方法,该关键字表示该类或方法为最终版本,即该类不能被继承,或该方法在子类中不能被重载(覆盖)。关键字用于定义类和方法,该关键字表示该类或方法为最终版本,即该类不能被继承,或该方法在子类中不能被重载(覆盖)。p类使用类使用 final 关键字的实例:关键字的实例:pfinal class Personpp
21、 .ppfinal 定义的类被继承时会提示如下错误:定义的类被继承时会提示如下错误:pFatal error: Class Student may not inherit from final class (Person) in .p方法使用方法使用 final 关键字的实例:关键字的实例:pclass Personpp final function say()p p .p p14 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.6 PHP 类的接口类的接口 interface 与与 implements 关键字关键字15 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.6.1
22、 PHP 接口接口pPHP 类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了,为此类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了,为此 PHP 引入了类引入了类的接口技术。的接口技术。p如果一个抽象类里面的所有方法都是抽象方法,且没有声明变量,而且接口里面所有的成员都是如果一个抽象类里面的所有方法都是抽象方法,且没有声明变量,而且接口里面所有的成员都是 public 权限的,那权限的,那么这种特殊的抽象类就叫么这种特殊的抽象类就叫 接口接口 。p接口使用关键字接口使用关键字 interface 来定义,并使用关键字来定义,并使用关键字
23、implements 来实现接口中的方法,且必须完全实现。来实现接口中的方法,且必须完全实现。16 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.6.1 PHP 接口接口1.实例实例4使用关键字使用关键字 interface 定义接口,并使用关键字定义接口,并使用关键字 implements 实现接口中的方法实现接口中的方法p实例代码如下:实例代码如下:pdiscount;p p function getUserType() p return VIP用户用户;p ppclass Goodsp var $price = 100;p var $vc;p 17 重庆电子工程职业学院PHP程
24、序设计基础 主编 陈学平5.6.1 PHP 接口接口1. 实例实例4使用关键字使用关键字 interface 定义接口,并使用关键字定义接口,并使用关键字 implements 实现接口中的方法实现接口中的方法p /定义定义 User 接口类型参数,这时并不知道是什么用户接口类型参数,这时并不知道是什么用户p function run(User $vc)p $this-vc = $vc;p $discount = $this-vc-getDiscount();p$usertype = $this-vc-getUserType();p echo $usertype.商品价格:商品价格:.$thi
25、s-price*$discount;p pp$display = new Goods();p$display -run(new VipUser);/可以是更多其他用户类型可以是更多其他用户类型p?p运行该实例,输出:运行该实例,输出:pVIP用户商品价格:用户商品价格:80 元元 p该实例演示了一个该实例演示了一个 PHP 接口的简单应用。该实例中,接口的简单应用。该实例中,User 接口实现用户的折扣,而在接口实现用户的折扣,而在 VipUser 类里面实现了具体类里面实现了具体的折扣系数。最后商品类的折扣系数。最后商品类 Goods 根据根据 User 接口来实现不同的用户报价。接口来实现
26、不同的用户报价。p该实例仅限于演示该实例仅限于演示 PHP 接口的用法,不涉及其科学与否。接口的用法,不涉及其科学与否。18 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.6.2 实现多个接口实现多个接口pPHP也可以在继承一个类的时候同时实现多个接口:也可以在继承一个类的时候同时实现多个接口:pclass 子类子类 extends 父类父类 implemtns 接口接口1, 接口接口2, .pp .p19 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.6.3 抽象类和接口的区别抽象类和接口的区别p接口是特殊的抽象类,也可以看做是一个模型的规范。接口与抽象类大致区别如下:接
27、口是特殊的抽象类,也可以看做是一个模型的规范。接口与抽象类大致区别如下:p一个子类如果一个子类如果 implements 一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可。只需要实现需要的方法即可。p如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已(相对老的
28、方法实现)。变了,其子类对应的方法名将不受影响,只是变成了一个新的方法而已(相对老的方法实现)。p抽象类只能单继承,当一个子类需要实现的功能需要继承自多个父类时,就必须使用接口。抽象类只能单继承,当一个子类需要实现的功能需要继承自多个父类时,就必须使用接口。20 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.7 PHP 类的访问控制与封装类的访问控制与封装pPHP 中通过在前面添加访问修饰符中通过在前面添加访问修饰符 public、protected 或或 private 来实现对属性或方法的访问控制。来实现对属性或方法的访问控制。21 重庆电子工程职业学院PHP程序设计基础 主编
29、陈学平5.7.1 访问控制访问控制p类型的访问修饰符允许开发人员对类成员的访问进行控制,这是面向对象类型的访问修饰符允许开发人员对类成员的访问进行控制,这是面向对象 OOP 语言的一个特性。语言的一个特性。pPHP 支持如下三种访问修饰符:支持如下三种访问修饰符:ppublic (公有的公有的):类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)这个类成员:类中的成员将没有访问限制,所有的外部成员都可以访问(读和写)这个类成员(包括成员属性和包括成员属性和成员方法成员方法)。如果类的成员没有指定成员访问修饰符,将被视为。如果类的成员没有指定成员访问修饰符,将被视为 public 。p
30、protected (受保护的受保护的):被定义为:被定义为 protected 的成员不能被该类的外部代码访问,但该类的子类具有访问权限。的成员不能被该类的外部代码访问,但该类的子类具有访问权限。pprivate (私有的私有的):被定义为:被定义为 private 的成员,允许同一个类里的所有成员访问,但对于该类的外部代码和子类都不的成员,允许同一个类里的所有成员访问,但对于该类的外部代码和子类都不允许访问。允许访问。p修饰符访问权限对照表:修饰符访问权限对照表:publicprotectedprivate同一个类中同一个类中类的子类中类的子类中所有的外部成员所有的外部成员提示提示p在子类
31、覆盖父类的方法时,子类中方法的访问权限不能低于父类被覆盖方法的访问权限。在子类覆盖父类的方法时,子类中方法的访问权限不能低于父类被覆盖方法的访问权限。22 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.7.2 封装封装p封装,就是把类(对象)的属性和服务结合成一个独立的单位,并尽可能隐藏内部的细节,只保留必要的接口与外封装,就是把类(对象)的属性和服务结合成一个独立的单位,并尽可能隐藏内部的细节,只保留必要的接口与外部发生联系。这种封装特性,有效的保证了对象的独立性,使软件错误能够局部化,大大减少查错和排错的难度。部发生联系。这种封装特性,有效的保证了对象的独立性,使软件错误能够局部
32、化,大大减少查错和排错的难度。p使用使用 private 关键字来对属性和方法进行封装:关键字来对属性和方法进行封装:23 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.7.2 封装封装1.实例实例5使用使用 private 关键字对属性和方法进行封装关键字对属性和方法进行封装p实例代码如下:实例代码如下:pname=$name;p $this-age=$age;p p function say() p echo 我的名字叫:我的名字叫:.$this-name.;pecho 我的年龄是:我的年龄是:.$this-age;p pp$p1=new Person(张三张三, 20);p$p
33、1-say();p?p输出结果输出结果p我的名字叫:张三p我的年龄是:20p在该实例中,如果试图用在该实例中,如果试图用 $p1-name = 张三张三; 这种方式去访问对象属性就会产生错误。而构造方法和这种方式去访问对象属性就会产生错误。而构造方法和 say() 方法没有指定私有属性,在方法没有指定私有属性,在 PHP 中则默认为中则默认为公有的(公有的(public)。)。24 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.8 PHP 自动加载类自动加载类 1. _autoload() 方法用于自动加载类。方法用于自动加载类。p在实际项目中,不可能把所有的类都写在一个在实际项目中
34、,不可能把所有的类都写在一个 PHP 文件中,当在一个文件中,当在一个 PHP 文件中需要调用另一个文件中声明的类文件中需要调用另一个文件中声明的类时,就需要通过时,就需要通过 include 把这个文件引入。不过有的时候,在文件众多的项目中,要一一将所需类的文件都把这个文件引入。不过有的时候,在文件众多的项目中,要一一将所需类的文件都 include 进来,需要在每个类文件开头写一个长长的包含文件的列表。那么能不能在使用类的时候,再把这个类所在的进来,需要在每个类文件开头写一个长长的包含文件的列表。那么能不能在使用类的时候,再把这个类所在的 php 文件导入呢?文件导入呢?p为此,为此,PH
35、P 提供了提供了 _autoload() 方法,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在方法,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。出错失败前有了最后一个机会加载所需的类。p_autoload() 方法接收的一个参数,就是欲加载的类的类名,所以这时候需要类名与文件名对应,如方法接收的一个参数,就是欲加载的类的类名,所以这时候需要类名与文件名对应,如 Person.php ,对应的类名就是对应的类名就是 Pserson 。25 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.8 PHP
36、 自动加载类自动加载类1.实例实例6_使用使用_autoload() 方法自动加载类方法自动加载类p实例代码如下:实例代码如下:pPserson.phppname = $name;p $this-age = $age;p p function say() pecho 我的名字叫:我的名字叫:.$this-name.;pecho 我的年龄是:我的年龄是:.$this-age;p pp?ptest.phpp say();p?p运行运行 test.php ,输出:,输出:p我的名字叫:张三我的名字叫:张三p我的年龄是:我的年龄是:2026 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.9
37、范围解析操作符(范围解析操作符(:)27 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.9.1 范围解析操作符(范围解析操作符(:)p范围解析操作符(范围解析操作符(:)是一对冒号,可以用于访问静态成员、方法和常量,以及被覆盖类中的成员和方法。)是一对冒号,可以用于访问静态成员、方法和常量,以及被覆盖类中的成员和方法。p当在类的外部使用当在类的外部使用 : 符号访问这些静态成员、方法和常量时,必须使用类的名字,如下面实例所示。符号访问这些静态成员、方法和常量时,必须使用类的名字,如下面实例所示。28 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.9.2 : 访问静态成员、方
38、法实例访问静态成员、方法实例1. 实例实例7 使用使用: 访问静态成员、方法访问静态成员、方法p实例代码如下:实例代码如下:p?phppClass Personp / 定义静态成员属性定义静态成员属性p public static $country = 中国中国;p / 定义静态成员方法定义静态成员方法p public static function myCountry() p /内部访问静态成员属性内部访问静态成员属性p echo 我是我是.self:$country.人人;p pp/ 输出静态成员属性值输出静态成员属性值pecho Person:$country.;p/ 访问静态方法访问静
39、态方法pPerson:myCountry();p?p输出结果输出结果p中国中国p我是中国人我是中国人p使用使用 : 符号访问静态成员及方法参考符号访问静态成员及方法参考PHP 静态(静态(static)。)。29 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.9.3 : 访问父类覆盖成员和方法访问父类覆盖成员和方法的实例的实例1.实例实例8 使用使用: 访问父类覆盖成员和方法访问父类覆盖成员和方法p实例代码如下:实例代码如下:pname.;pecho 性别:性别:.$this-sex.;pecho 我的年龄是:我的年龄是:.$this-age;p ppclass Student ex
40、tends Person p var $school;p function say() p parent:say();p echo 我在我在.$this-school.上学上学;p pp/$P1=new Person();p$P2=new Student();p$P2-name=张三张三;p$P2-sex=男男;p$P2-age=20;p$P2-say();p输出结果输出结果p我的名字叫:张三性别:男我的年龄是:20我在上学30 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.10 PHP 类的静态成员属性与静类的静态成员属性与静态方法态方法pPHP 类中定义静态的成员属性和方法使用类
41、中定义静态的成员属性和方法使用 static 关键字。关键字。31 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.10.1 静态静态 staticp声明类成员或方法为声明类成员或方法为 static ,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外)。,就可以不实例化类而直接访问,不能通过一个对象来访问其中的静态成员(静态方法除外)。静态成员属于类,不属于任何对象实例,但类的对象实例都能共享。静态成员属于类,不属于任何对象实例,但类的对象实例都能共享。1. 实例实例9使用使用static声明类成员或方法声明类成员或方法p实例代码如下:实例代码如下:p?
42、phppClass Personp / 定义静态成员属性定义静态成员属性p public static $country = 中国中国;p / 定义静态成员方法定义静态成员方法p public static function myCountry() p / 内部访问静态成员属性内部访问静态成员属性p echo 我是我是.self:$country.人人;p ppclass Student extends Person p function study() p echo 我是我是. parent:$country.人人;p p32 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.10.1
43、 静态静态 static1. 实例实例9使用使用static声明类成员或方法声明类成员或方法33 重庆电子工程职业学院PHP程序设计基础 主编 陈学平p/ 输出成员属性值输出成员属性值pecho Person:$country.;/ 输出:中国输出:中国p$p1 = new Person();p/echo $p1-country;/ 错误写法错误写法p/ 访问静态成员方法访问静态成员方法pPerson:myCountry();/ 输出:我是中国人输出:我是中国人p/ 静态方法也可通过对象访问:静态方法也可通过对象访问:p$p1-myCountry();p/ 子类中输出成员属性值子类中输出成员属
44、性值pecho Student:$country.;/ 输出:中国输出:中国p$t1 = new Student();p$t1-study();/ 输出:我是中国人输出:我是中国人p?p运行该实例,输出:运行该实例,输出:p中国中国p我是中国人我是中国人p我是中国人我是中国人p中国中国p我是中国人我是中国人34 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.10.2 静态属性方法静态属性方法p在类内部访问静态成员属性或者方法,使用在类内部访问静态成员属性或者方法,使用 self:(注意不是(注意不是 $slef),如:),如:pslef: $countrypslef: myCount
45、ry()p在子类访问父类静态成员属性或方法,使用在子类访问父类静态成员属性或方法,使用 parent:(注意不是(注意不是 $parent),如:),如:pparent: $countrypparent: myCountry()p外部访问静态成员属性和方法为外部访问静态成员属性和方法为 类名类名/子类名子类名: ,如:,如:pPerson:$countrypPerson:myCountry()pStudent:$countryp但静态方法也可以通过普通对象的方式访问。但静态方法也可以通过普通对象的方式访问。35 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.11 PHP 常量(常量(
46、const)1.类中的常量类中的常量 constp在类里面定义常量用在类里面定义常量用 const 关键字,而不是通常的关键字,而不是通常的 define() 函数。函数。p语法:语法:pconst constant = value;2.实例实例10:使用:使用const 关键字定义常量关键字定义常量p实例代码如下:实例代码如下:p?phppClass Personp / 定义常量定义常量p const country = 中国中国;p public function myCountry() p /内部访问常量内部访问常量p echo 我是我是.self:country.人人;p pp/ 输出
47、常量输出常量pecho Person:country.;p/ 访问方法访问方法p$p1 = new Person();p$p1 - myCountry();p?p运行该实例输出:运行该实例输出:p中国中国p我是中国人我是中国人p常量的值一旦被定义后就不可在程序中更改。常量的值一旦被定义后就不可在程序中更改。36 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.12 PHP 特殊方法特殊方法pPHP的类的特殊方法如下的类的特殊方法如下p_set() 方法用于设置私有属性值。方法用于设置私有属性值。p_get() 方法用于获取私有属性值。方法用于获取私有属性值。p_isset() 方法用于
48、检测私有属性值是否被设定。方法用于检测私有属性值是否被设定。p_unset() 方法用于删除私有属性。方法用于删除私有属性。p实际应用中,经常会把类的属性设置为私有(实际应用中,经常会把类的属性设置为私有(private),那么需要对属性进行访问时,就会变得麻烦。虽然可以将),那么需要对属性进行访问时,就会变得麻烦。虽然可以将对属性的访问写成一个方法来实现,但对属性的访问写成一个方法来实现,但 PHP 提供了一些特殊方法来方便此类操作。提供了一些特殊方法来方便此类操作。37 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.12.1 _set()p_set() 方法用于设置私有属性值:方
49、法用于设置私有属性值:p语法如下:语法如下:pfunction _set($property_name, $value)p p $this-$property_name = $value; pp在类里面使用了在类里面使用了 _set() 方法后,当使用方法后,当使用 $p1-name = 张三张三; 这样的方式去设置对象私有属性的值时,就会自动调这样的方式去设置对象私有属性的值时,就会自动调用用 _set() 方法来设置私有属性的值。方法来设置私有属性的值。38 重庆电子工程职业学院PHP程序设计基础 主编 陈学平5.12.2 _get()1. _get() 方法用于获取私有属性值:方法用于获
50、取私有属性值:p语法如下:语法如下:pfunction _set($property_name, $value)p p return isset($this-$property_name) ? $this-$property_name : null;p2. 实例实例11:_合适合适get() 方法获取私有属性值方法获取私有属性值p实例代码如下:实例代码如下:p?phppclass Person p private $name;p private $sex;p private $age;p /_set()方法用来设置私有属性方法用来设置私有属性p function _set($property_