在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载。单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法重写。

子类中重载父类的方法就是在子类中覆盖从父类中继承过来的方法,父类中的方法被子类继承过来不就可以直接使用吗?为什么还要重载呢?因为有一些情况我们必须要覆盖的。例如,有一个“鸟”类,在这个类中定义了鸟的通用方法“飞翔”。将“鸵鸟”类作为它的子类,就会将“飞翔”的方法继承过来,但只要一调用“鸵鸟”类中的这个“飞翔”的方法,鸵鸟就会飞走。虽然鸵鸟是不会飞的,但其他特性都具有“鸟类”的特性,所以在声明“鸵鸟”类时还是可以继承“鸟”类的,但必须在“鸵鸟”类中将“鸟”类中继承过来的“飞翔”方法改写,就需要在子类中重载父类中的方法。

在下面的例子中,声明的Person类中有一个“说话”方法,Student类继承Person类后可以直接使用“说话”方法。但Person类中的“说话”方法只能说出它自己的成员属性,而Student类对Person类进行了扩展,多添加了几个新的成员属性。代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
    class Person{
        protected $name;
        protected $sex;
        protected $Wage;
 
        function __construct($name="",$sex="男",$age=1){
            $this ->name = $name;
            $this ->sex = $sex;
            $this ->age = $age;
        }
 
        //在人类中声明一个通用的说话方法,介绍一下自己
        function say(){
            echo "我的名字:".$this-> name.",性别:".$this ->sex.",年龄:".$this ->age."。<br>"
        }
    }
 
    //声明一个学生类,使用extends关键字扩展(继承)person类
 
    class Student extends Person {
        private $school;        //在学生类中声明一个所在学校school的成员属性
 
        //覆盖父类中的构造方法,在参数列表中添加一个学校属性,用来创建对象并初始化成员属性
        function __construct($name="",$sex="男",$age=1,$school=""){
            $this ->name = $name;
            $this ->sex = $sex;
            $this ->age = $age;
            $this ->school = $school;
        }
 
        function study(){
            echo $this ->name."正在".$this ->school."学习<br>";
        }
 
        //定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在的学校名称
 
        function say(){
            echo "我的名字:".$this ->name.",性别:".$this ->sex.",年龄:".$this ->age.",在".$this ->school."学校上学<br>";
        }
    }
 
    $student= new Student("张三","男",20,"edu");       //创建一个学生对象,并传给一个学校名称参数
    $student -> say();           //调用学生类中覆盖父类的说话方法
?>

改程序运行后输出的结果为:
我的名字叫:张三,性别:男,我的年龄是:20,在edu学校上学

在PHP中,提供了在子类重载的方法中调用父类被覆盖方法的功能。这样就可以在子类重写的方法中,继续使用从父类继承过来并被覆盖的方法,然后再按要求多添加一些新功能。调用的格式是使用“parent:方法名”在子类的重载方法中调用父类中被覆盖的方法。将上例中的代码修改一下,在子类重写的构造方法中使用“parent::__construct()”调用父类中被覆盖的构造方法,再多添加一条对子类中新扩展的成员属性初始化的代码。在子类中重写的say()方法中使用“parent::say()”调用父类中被覆盖的say()方法,再添加上输出子类成员属性的功能。代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php
    class Person{
        protected $name;
        protected $sex;
        protected $Wage;
 
        function __construct($name="",$sex="男",$age=1){
            $this ->name = $name;
            $this ->sex = $sex;
            $this ->age = $age;
        }
 
        //在人类中声明一个通用的说话方法,介绍一下自己
        function say(){
            echo "我的名字:".$this-> name.",性别:".$this ->sex.",年龄:".$this ->age."。<br>"
        }
    }
 
    //声明一个学生类,使用extends关键字扩展(继承)person类
 
    class Student extends Person {
        private $school;        //在学生类中声明一个所在学校school的成员属性
 
        //覆盖父类中的构造方法,在参数列表中添加一个学校属性,用来创建对象并初始化成员属性
        function __construct($name="",$sex="男",$age=1,$school=""){
            //调用父类中被覆盖的构造方法,为从父类中集成过来额出行赋初值
            parent::__construct($name,$sex,$age);
            $this ->school = $school;
        }
 
        function study(){
            echo $this ->name."正在".$this ->school."学习<br>";
        }
 
        //定义一个和父类中同名的方法,将父类中的说话方法覆盖并重写,多说出所在的学校名称
 
        function say(){
            parent::say();          //调用父类中被本方法覆盖掉的方法
            echo "在".$this ->school."学校上学<br>";
        }
    }
 
    $student= new Student("张三","男",20,"edu");       //创建一个学生对象,并传给一个学校名称参数
    $student -> say();           //调用学生类中覆盖父类的说话方法
?>

上面的例子输出的结果和前一个例子是一样的,但在本例中通过在子类中直接调用父类中被覆盖的方法要简便很多。另外,在子类覆盖父类的方法时一定要注意,在子类中重写的方法访问权限一定不能低于父类被覆盖的方法的访问权限。例如,如果父类中的访问权限是protected,那么在子类中重写的方法的权限就要是protected或public。

 

>> 本文固定链接: http://php.ncong.com/php_course/oop/reload_parent.html

>> 转载请注明: 恩聪php 2014年07月24日 于 恩聪PHP学习教程 发表

子类重载父类的方法“parent:方法名”的更多相关文章

  1. 子类重载父类的方法“parent::方法名”转于 恩聪PHP学习教程

    在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载.单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法 ...

  2. Python子类调用父类内属性的方法

    常见的就是初始化方法__init__() python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函 ...

  3. java怎么调用子类中父类被覆盖的方法

    public class b { { void show() { System.out.println("b"); } } public class c extends b { v ...

  4. javascript练习-子类调用父类的构造函数和方法

    function NonNullSet(){ Set.apply(this,arguments); } NonNullSet.prototype = inherit(Set.prototype); N ...

  5. [Go] 子类 调用 父类 的 属性、方法

    package main import ( "fmt" ) type A struct { Text string Name string } func (a *A) Say() ...

  6. python 子类继承父类属性及实例化方法

  7. c++子类和父类成员函数重名

    子类和父类返回值参数相同,函数名相同,有virtual关键字,则由对象的类型决定调用哪个函数. 子类和父类只要函数名相同,没有virtual关键字,则子类的对象没有办法调用到父类的同名函数,父类的同名 ...

  8. python之子类继承父类时进行初始化的一些问题

    直接看代码: class Person: def __init__(self): self.name = "jack" class Student(Person): def __i ...

  9. Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现

    前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...

随机推荐

  1. mongodb创建用户和密码

    创建数据库文件夹与日志文件mkdir /home/mongodb/datamkdir /home/mongodb/logstouch(创建文件)3. 启动mongodbcd到mongodb目录下的bi ...

  2. 转:virtualbox+ubuntu设置共享文件夹

    1.       进入系统,安装增强功能,安装完关闭系统. 2.       在E盘下创建一个共享文件夹 gongxiang. 3.       设置->数据空间->固定分配,选择共享文件 ...

  3. 普通的101键盘在Mac上的键位对应

    为了方便,搞了一个普通的101有线全键盘 + Magic TrackPad配Macbook.        然后发现了一个小问题,按键对应似乎不像我想的那么完美,F1~F12和Macbook不对应,于 ...

  4. gis论坛

    http://bbs.csdn.net/forums/GIS/ http://forums.mysql.com/list.php?23 http://www.remotegis.net/ http:/ ...

  5. COJ 0979 WZJ的数据结构(负二十一)

    WZJ的数据结构(负二十一) 难度级别:C: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你实现一个数据结构,完成这样的功能: 给你一个 ...

  6. linux内核链表的移植与使用

    一.  Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...

  7. Linux桌面快捷方式建立方案

    Linux桌面快捷方式建立方案 以下以添加Eclips为例 在桌面上添加Eclips.desktop 文件,向其写入如下代码 [Desktop Entry] Name=Eclipse Comment= ...

  8. Solr4.4.0部署到tomcat上

    主要步骤如下: 1.下载solr-4.4.0.tgz 2.解压缩solr-4.4.0.tgz,命令tar -xzvf solr-4.4.0.tgz 3.压缩后进入到solr-4.4.0目录,将 exa ...

  9. 飞行模式下不让打开FM

     android 判断手机当前是否是飞行模式,在AirplaneModeEnabler中 提供了isAirplaneModeOn方法来判断当前是否是Airplane mode:public stati ...

  10. C#读取注册表

    //1.向注册表中写信息using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"", true)){ if (key ...