ddxiami

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2955|回复: 3

[细说PHP] 第10章PHP面向对象的程序设计--继承性

[复制链接]
发表于 2013-8-6 14:15:14 | 显示全部楼层 |阅读模式
类继承的应用

<?php
        //声明一个人类,定义人所具有的一些其本的属性和功能成员,作为父类
        class Person {                                  
                var $name;                                         //声明一个存储人的名字的成员
                var $sex;                                   //声明一个存储人的性别的成员
                var $age;                                   //声明一个存储人的年龄的成员
               
            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>";
                }       
               
                function run() {                         
                        echo $this->name."正在走路。<br>";
                }
        }

        //声明一个学生类,使用extends关键字扩展(继承)Person类
        class Student extends Person {                  
                var $school;                             //在学生类中声明一个所在学校school的成员属性
               
                //在学生类中声明一个学生可以学习的方法
                function study() {                       
                        echo $this->name."正在".$this->school."学习<br>";
                }       
        }

        //再声明一个教师类,使用extends关键字扩展(继承)Student类
        class Teacher extends Student {                 
                var $wage;                              //在教师类中声明一个教师工资wage的成员属性
               
                //在教师类中声明一个教师可以教学的方法
                function teaching() {                     
                        echo $this->name."正在".$this->school."教学,每月工资为".$this->wage."。<br>";       
                }
        }
       
        $teacher1 = new Teacher("张三", "男", 40);         //使用继承过来的构造方法创建一个教师对象
       
        $teacher1->school = "edu";                                //将一个教师对象中的所在学校的成员属性school赋值
        $teacher1->wage = 3000;                                 //将一个教师对象中的成员属性工资赋值

        $teacher1->say();                                              //调用教师对象中的说话方法
        $teacher1->study();                                            //调用教师对象中的学习方法
        $teacher1->teaching();                                  //调用教师对象中的教学方法
回复

使用道具 举报

 楼主| 发表于 2013-8-6 15:17:18 | 显示全部楼层
访问类型控制

<?php
        //声明一个类作为父类使用,将它的成员都声明为私有的
        class MyClass {                        
                private $var1 = 100;                  //声明一个私有的成员属性并给初值为100
               
                //声明一个成员方法使用private关键字设置为私有的
                private function printHello() {        
                        echo "hello<br>";                     //在方法中只有一条输出语句作为测试使用
                }
        }

        //声明一个MyClass类的子类试图访问父类中的私有成员
        class MyClass2 extends MyClass {         
                //在类中声明一个公有方法,访问父类中的私有成员
                function useProperty() {
                        echo "输出从父类继承过来的成员属性值".$this->var1."<br>";         //访问父类中的私有属性
                        $this->printHello();                                             //访问父类中的私有方法
                }
        }

        $subObj = new MyClass2();                      //初始化出子类对象
        $subObj->useProperty();                 //调用子类对象中的方法实现对父类私有成员的访问
?>



<?php
        //声明一个类作为父类使用,将它的成员都声明为保护的
        class MyClass {                                   
                protected $var1=100;                          //声明一个保护的成员属性并给初值为100

                protected function printHello() {   //声明一个成员方法使用protected关键字设置为保护的
                        echo "hello<br>";                   //在方法中只有一条输出语句作为测试使用
                }
        }

        //声明一个MyClass类的子类试图访问父类中的保护成员
        class MyClass2 extends MyClass {     
                //在类中声明一个公有方法,访问父类中的保护成员
                function useProperty() {
                        echo "输出从父类继承过来的成员属性值".$this->var1."<br>";        //访问父类中受保护的属性
                        $this->printHello();                                             //访问父类中受保护的方法
                }
        }

        $subObj = new MyClass2();                          //初始化出子类对象
        $subObj->useProperty();                            //调用子类对象中的方法实现对父类保护的成员访问
    echo $subObj->var1;                               //试图访问类中受保护的成员,结果出错
?>
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 15:18:50 | 显示全部楼层
子类中重载父类的方法

<?php
        //声明一个人类,定义人所具有的一些其本的属性和功能成员,作为父类
        class Person {                              
                protected $name;                  
                protected $sex;              
                protected $age;               
               
            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();                                         //调用学生类中覆盖父类的说话方法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 15:26:43 | 显示全部楼层
在子类重写的方法中,继续使用从父类中继承过来并被覆盖的方法,然后再按要求添加一些新功能。调用的格式是使用“parent::方法名”

<?php
        class Person {                                  
                protected $name;                          
                protected $sex;                      
                protected $age;                       
               
            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;                     
       
         //覆盖父类中的构造方法,在参数列表中多添加一个学校属性,用来创建对象并初始化成员属性
            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();                                //调用学生类中覆盖父类的说话方法
?>
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|技术文档库 ( 闽ICP备15017263号-2 )|网站地图

GMT+8, 2025-5-18 22:24 , Processed in 0.039535 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表