1、2023年1月25日星期三PHP+MySQL程序设计1PHP5中的继承中的继承n继承继承是面向对象最重要的特点之一,就是可以实现对类的复用。是面向对象最重要的特点之一,就是可以实现对类的复用。n通过通过“继承继承”一个现有的类,可以使用已经定义的类中的方法和属性。一个现有的类,可以使用已经定义的类中的方法和属性。n继承而产生的类叫做继承而产生的类叫做子类。子类。n被继承的类,叫做被继承的类,叫做父类父类,也被成为,也被成为超类超类。nPHPPHP是单继承的,一个类只可以继承一个父类,但一个父类却可以被多是单继承的,一个类只可以继承一个父类,但一个父类却可以被多个子类所继承。个子类所继承。n从子
2、类的角度看,它从子类的角度看,它“继承(继承(inheritinherit,extendsextends)”自父类;而从父类自父类;而从父类的角度看,它的角度看,它“派生(派生(derivederive)”子类。它们指的都是同一个动作,只子类。它们指的都是同一个动作,只是角度不同而已。是角度不同而已。n子类不能继承父类的私有属性和私有方法。子类不能继承父类的私有属性和私有方法。n在在PHP5PHP5中类的方法可以被继承,类的构造函数也能被继承。中类的方法可以被继承,类的构造函数也能被继承。n继承的简单例子继承的简单例子n我们分析自然界中的关系,动物类与犬类的关系。我们分析自然界中的关系,动物类
3、与犬类的关系。2023年1月25日星期三PHP+MySQL程序设计2Dog类继承自animal类。当我们实例化animal类的子类Dog类时,父类的方法setWeight()和getWeight()被继承。我们可以直接调用父类的方法设置其属性$weight,取得其属性$weight。2023年1月25日星期三PHP+MySQL程序设计3构造函数的继承构造函数的继承n有些资料上说有些资料上说PHP5PHP5的构造函数不被继承。的构造函数不被继承。n演示的结果证明,演示的结果证明,PHP5PHP5的构造函数被继承了。的构造函数被继承了。n当子类当子类Dog1Dog1被实例化时,继承的构造函数被调用
4、了。被实例化时,继承的构造函数被调用了。n屏幕上显示了一句屏幕上显示了一句I am anAnimalI am anAnimal.2023年1月25日星期三PHP+MySQL程序设计4私有变量和方法不被继承私有变量和方法不被继承n私有变量不被继承,私有方法也不被继承。私有变量不被继承,私有方法也不被继承。n另外一种说法,私有变量和属性被继承了,但不能被调用。另外一种说法,私有变量和属性被继承了,但不能被调用。n无论怎么说,都无论怎么说,都不能调用父类的私有属性和私有方法。不能调用父类的私有属性和私有方法。2023年1月25日星期三PHP+MySQL程序设计52023年1月25日星期三PHP+My
5、SQL程序设计62.2访问控制访问控制n在在PHP5中,可以在类的属性和方法前面加上一个修饰符中,可以在类的属性和方法前面加上一个修饰符(modifier),来对类进行一些访问上的控制。),来对类进行一些访问上的控制。2023年1月25日星期三PHP+MySQL程序设计7Private的访问权限的访问权限nprivate不能直接被外部调用,只能由当前对象调用。不能直接被外部调用,只能由当前对象调用。n前面介绍过关于封装的内容前面介绍过关于封装的内容.这里不再重复。这里不再重复。n比如你可以借钱给别人,但不希望别人知道你钱包里面有比如你可以借钱给别人,但不希望别人知道你钱包里面有多少钱。多少钱。
6、n我们把它用我们把它用private隐藏起来。隐藏起来。2023年1月25日星期三PHP+MySQL程序设计82023年1月25日星期三PHP+MySQL程序设计92023年1月25日星期三PHP+MySQL程序设计10protected的访问权限的访问权限nprotectedprotected修饰的属性和方法只能被子类调用。修饰的属性和方法只能被子类调用。外界无法调用。外界无法调用。2023年1月25日星期三PHP+MySQL程序设计112023年1月25日星期三PHP+MySQL程序设计122023年1月25日星期三PHP+MySQL程序设计13public的访问权限的访问权限n数据的隐藏
7、和封装是能够帮助我们保护数据的安全性。数据的隐藏和封装是能够帮助我们保护数据的安全性。nPublic修饰的属性和方法,可以被无限制的调用。修饰的属性和方法,可以被无限制的调用。2023年1月25日星期三PHP+MySQL程序设计142023年1月25日星期三PHP+MySQL程序设计152023年1月25日星期三PHP+MySQL程序设计162.3重写(重写(override)n如果从父类继承的方法不能满足子类的需求,可以对其进如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖行改写,这个过程叫方法的覆盖(overrideoverride),),也称为也称为方方法的
8、重写。法的重写。n当对父类的方法进行重写时,子类中的方法必须和父类中当对父类的方法进行重写时,子类中的方法必须和父类中对应的方法对应的方法具有相同的方法名称,在具有相同的方法名称,在PHP5PHP5中不限制输入参中不限制输入参数类型、参数数量和返回值类型。(数类型、参数数量和返回值类型。(这点和这点和JAVAJAVA不同)不同)n子类中的覆盖方法不能使用比父类中被覆盖方法更严格的子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。访问权限。n声明方法时,如果不定义访问权限。默认权限为声明方法时,如果不定义访问权限。默认权限为publicpublic。2023年1月25日星期三PHP+M
9、ySQL程序设计17PHP5重写方法重写方法n先设置一个父类,这个父类是先设置一个父类,这个父类是“Dog”类,这个类描述了类,这个类描述了dog的特性。的特性。nDog有有2个眼睛,会跑,会叫。就这样描述先。个眼睛,会跑,会叫。就这样描述先。n我养了一只狗,是只小狗,符合我养了一只狗,是只小狗,符合Dog类的特性,但有所不同。类的特性,但有所不同。n我的小狗有名字,我的小狗太小了,不会大声的叫,只会我的小狗有名字,我的小狗太小了,不会大声的叫,只会哼哼。哼哼。n我们用继承的概念去实现这个设计。我们用继承的概念去实现这个设计。2023年1月25日星期三PHP+MySQL程序设计182023年1
10、月25日星期三PHP+MySQL程序设计192023年1月25日星期三PHP+MySQL程序设计20重写方法与访问权限重写方法与访问权限n子类中的覆盖方法不能使用比父类中被覆盖方法更严格的子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。访问权限。n父类为父类为public子类为子类为private时。时。2023年1月25日星期三PHP+MySQL程序设计212023年1月25日星期三PHP+MySQL程序设计222023年1月25日星期三PHP+MySQL程序设计23重写时的参数数量重写时的参数数量n子类可以拥有与父类不同的参数数量。子类可以拥有与父类不同的参数数量。(这点与这点
11、与java不同,不同,PHP是弱类型语言。是弱类型语言。)2023年1月25日星期三PHP+MySQL程序设计242023年1月25日星期三PHP+MySQL程序设计25构造函数重写构造函数重写n下面这个例子中,父类和子类都有自己的构造函数,当子下面这个例子中,父类和子类都有自己的构造函数,当子类被实例化时,子类的构造函数被调用,而父类的构造函类被实例化时,子类的构造函数被调用,而父类的构造函数没有被调用,请对比第一节的构造函数继承。数没有被调用,请对比第一节的构造函数继承。n(注:这点和(注:这点和Java不同,在不同,在java中构造函数是不能被继承的,中构造函数是不能被继承的,而且子类实
12、例化时,子类的构造函数被调用,父类的构造而且子类实例化时,子类的构造函数被调用,父类的构造函数也会调用。)函数也会调用。)2023年1月25日星期三PHP+MySQL程序设计262023年1月25日星期三PHP+MySQL程序设计272.4 this关键字关键字nPHP5中为解决变量的命名冲突和不确定性问题,引入关键中为解决变量的命名冲突和不确定性问题,引入关键字字n“$this”代表其所在代表其所在当前对象当前对象。n$this在构造函数中指该构造函数所创建的新对象在构造函数中指该构造函数所创建的新对象n在类中使用当前对象的属性和方法,必须使用在类中使用当前对象的属性和方法,必须使用$thi
13、s-取值。取值。n方法内的局部变量,不属于对象,不使用方法内的局部变量,不属于对象,不使用$this关键字取值。关键字取值。n局部变量和全局变量与局部变量和全局变量与$this关键字关键字n局部变量的只在当前对象的方法内有效,所以直接使用。局部变量的只在当前对象的方法内有效,所以直接使用。n注意:局部变量和属性可以同名,但用法不一样。在使用注意:局部变量和属性可以同名,但用法不一样。在使用中,要尽量避免这样使用,以免混淆。中,要尽量避免这样使用,以免混淆。2023年1月25日星期三PHP+MySQL程序设计282023年1月25日星期三PHP+MySQL程序设计29用用$this调用对象中的其
14、它方法调用对象中的其它方法2023年1月25日星期三PHP+MySQL程序设计30使用使用$this调用构造函数调用构造函数2023年1月25日星期三PHP+MySQL程序设计31$this到底指的什么?到底指的什么?$this就是指当前对象,我们甚至可以返回这个对象使用$this2023年1月25日星期三PHP+MySQL程序设计32通过通过$this传递对象传递对象2023年1月25日星期三PHP+MySQL程序设计332023年1月25日星期三PHP+MySQL程序设计342.5 parent:关键字关键字nPHP5中使用中使用parent:来引用父类的方法。来引用父类的方法。npare
15、nt:可用于调用父类中定义的成员方法。可用于调用父类中定义的成员方法。nparent:的追溯不仅于直接父类。的追溯不仅于直接父类。n通过通过parent:调用父类方法调用父类方法2023年1月25日星期三PHP+MySQL程序设计352023年1月25日星期三PHP+MySQL程序设计36父类的父类的private属性属性nPrivate属性是不能被继承的,如果父类有私有的属性。那属性是不能被继承的,如果父类有私有的属性。那么父类的方法只为父类的私有属性服务。么父类的方法只为父类的私有属性服务。n在子类中重新定义了一个属性在子类中重新定义了一个属性$saln系统却返回了父类的属性。系统却返回了
16、父类的属性。n如果父类中的属性被子类重写了。结果是这样的。如果父类中的属性被子类重写了。结果是这样的。n注意第注意第5行的属性定义变成了行的属性定义变成了protected。2023年1月25日星期三PHP+MySQL程序设计372023年1月25日星期三PHP+MySQL程序设计382023年1月25日星期三PHP+MySQL程序设计39子类中重写的方法对当前private有效2023年1月25日星期三PHP+MySQL程序设计40n如果你学过如果你学过java,你会觉得这一切都是很难理解的。,你会觉得这一切都是很难理解的。n在在Java中当子类被创建时,父类的属性和方法在内存中都中当子类被
17、创建时,父类的属性和方法在内存中都被创建,甚至构造函数也要被调被创建,甚至构造函数也要被调n用。用。nPHP5不是这样,不是这样,PHP5调用父类用的是调用父类用的是parent:而不是而不是parent-,这足以说明,这足以说明PHP5不想不想n在内存中让父类也被创建。在内存中让父类也被创建。PHP5想让继承变的比想让继承变的比Java更简更简单。单。n适应下就好。适应下就好。父类的父类的private属性属性2023年1月25日星期三PHP+MySQL程序设计412.5重载重载Overloadn当类中的方法名相同时,称为方法的重载当类中的方法名相同时,称为方法的重载(overload)n重载是重载是Java等面向对象语言中重要的一部分。等面向对象语言中重要的一部分。n在在PHP5中不支持重载。中不支持重载。n在在PHP5中不支持重载。中不支持重载。2023年1月25日星期三PHP+MySQL程序设计42如果传递过来三个数值。如何计算?下面的写法,在Java中是太平常不过了。但是在PHP5中,不能这样。PHP5不支持有多个相同名称的方法,也就是不支持重载。2023年1月25日星期三PHP+MySQL程序设计43对于一个方法,缺少参数时候会报错。当参数太多的时候,PHP就当什么都没有看到。程序可以正常运行。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。