菜单

PHP继承

2019年2月18日 - Java

PHP继承

那是一篇迟来的翻新,因为它应该在前二日就被更新了,可是由于小编克罗地亚语四级没过!没过!没过!导致本身心境消沉,所以就玩了几天的娱乐,哦不,举行了几天反思,痛定思痛
痛何如哉!

以下都以小编个人的知情,有错的地方还望不吝赐教。
怎么须求持续?
此起彼伏就是 二个子类通过extends父类把父类的品质和章程继承下去。
假如以往前几天亟需写三个类,小学生类和高中生类,小学生会说话,走路,考试,高中生也会说话走路,考试,那么一旦你写五回说话,走路,考试,那么就会来得臃肿,管理起来也会麻烦很多,假诺定义贰个类叫做学生类富含说话,走路,考试,然后让小学生类和高中生类来继续这几个学生类就会来得好过多,比如这样。

<?php
class student{
    function speak(){
        echo '说话';
    }
    function walk(){
        echo '走路';
    }
    function test(){
        echo '考试';
    }
}
class pupil extends student{
    function test(){
        echo '小学生考试';
    }
}
class senior extends student{
    function test(){
        echo '高中生考试';
    }
}
$pupil=new pupil();
$pupil->speak();
$pupil->walk();
$pupil->test();
echo '<br />';
$senior=new senior();
$senior->speak();
$senior->walk();
$senior->test();
?>

输出:

说话走路小学生考试
说话走路高中生考试

那般代码管理起来就会好广大。
若是将来小学生要学习3个新的技艺吃东西,小编今后那样写。

<?php
    class student{
        function speak(){
            echo '说话';
        }
        function walk(){
            echo '走路';
        }
        function test(){
            echo '考试';
        }
    }
    class skill{
        function eat(){
            echo '吃东西';
        }
    }
    class pupil extends student,skill{
        function test(){
            echo '小学生考试';
        }
    }
    $pupil=new pupil();
    $pupil->speak();
    $pupil->walk();
    $pupil->test();
    $pupil->eat();
?>

假定这么写,那么就会报错:

Fatal error: Class 'studentskill' not found in D:\xampp\htdocs\1.php on line 18

因为php中是不只怕如此达成多一而再的,即便想要达成多再三再四可以那样写:

<?php
        class student{
            function speak(){
                echo '说话';
            }
            function walk(){
                echo '走路';
            }
            function test(){
                echo '考试';
            }
        }
        class skill extends student{
            function eat(){
                echo '吃东西';
            }
        }
        class pupil extends skill{
            function test(){
                echo '小学生考试';
            }
        }
        $pupil=new pupil();
        $pupil->speak();
        $pupil->walk();
        $pupil->test();
        $pupil->eat();
?>

输出:

说话走路小学生考试吃东西

先用一个skill类继承student类,然后再用pupil类继承skill类,那样就一定于pupil类继承了student类和skill类。

情势重写
假如要落到实处的三个类有一道特征,那么就足以将以此合伙的性状抽象出1个父类。
譬如,有小学生类和中学生类,那样的五个类,他们都以学生,那么就可以抽象出二个学童类,学生都会考查,那么就把考试那个方法写在学员这些类里面。
那么难题不怕,小学生是小学生的考查,中学生是中学生的考试,小编不容许都输出考试,那里就用到了法子重写。
在子类中定义一个与父类一样的法子,那样举办的时候,父类中的方法就会被掩盖,从而输出的只有子类中定义的点子。
举例:

<?php
        class student{
            function test(){
                echo '考试';
            }
        }
        class pupil extends student{
            function test(){
                echo '小学生考试';
            }
        }
        class senior extends student{
            function test(){
                echo '中学生考试';
            }
        }
        $pupil=new pupil();
        $pupil->test();
        echo '<br />';
        $senior=new senior();
        $senior->test();
?>

输出:

小学生考试
中学生考试

7.6.1 PHP类的延续

此起彼伏已为咱们所熟悉的贰个程序设计特征,PHP
的目的模型也运用了后续。继承将会影响到类与类,对象与目标时期的关系。
例如,当扩张七个类,子类就会持续父类的有所国有和保安办法。可是子类的方法会覆盖父类的法子。
后续对于功效的设计和架空是不行管用的,而且对于接近的对象扩展新功用就无须重新再写这几个公用的效益。
php继承的基本点字:extends
格式:
[修饰符] class 子类名 extends 父类名{ … }

由此持续可以简化类的定义。

class Person{
        public $name;
        public $age;
        function getInfo(){...}
}

class Student{
        public $name;
        public $age;
        public $school;
        function getInfo(){...}
        function study(){...}
}

使用继承后的效果:
class Person{
        public $name;
        public $age;
        function getInfo(){...}
}
class Student extends Person{
        public $school;
        function study(){...}
}

PHP只支持单继承,不允许多重继承。一个子类只能有一个父类,不允许一个类直接继承多个类,但一个类可以被多个类继承。
可以有多层继承,即一个类可以继承某一个类的子类,如类B 继承了类A,类C又继承了类B,那么类C也间接继承了类A,
  class A{
     ....
  }
  class B  extends A{
     ....
  }
  class C  extends B{
     ....
  }

子类与父类的本性与措施

子类继承父类的装有内容,但父类中的private部分不能一贯访问
子类中新净增的习性和措施是对父类的壮大
子类中定义的与父类同名的性子是对父类属性的遮盖,同名的主意也是对父类方法的覆盖

走访类型控制

访问权限:
private protected public(默认的)


在相同类中: 可以 可以 可以
类的子类中: X 可以 可以
其余外部类中: X X 能够

定义一个父类(基类)
<?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>";
        }
    }

<?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;                    //试图访问类中受保护的成员,结果出错

子类中重载父类的方法

在子类里面允许重写(覆盖)父类的点子
在子类中,使用parent访问父类中的被掩盖的本性和艺术
parent::__construce();
parent::fun();

<?php
    class Person {                      
        protected $name;            
        protected $sex;                     
        public function __construct($name=“”, $sex=“男”) {  ...属性赋值 }
        public function say(){ ...输出属性信息 }   
    }
   class Student extends Person {  //声明学生类,使用extends继承Person类
        private $school;            
         //构造方法重写(覆盖)
        public function __construct($name="", $sex="男", $school="") {   
            parent::__construct($name,$sex);   //调用父类构造方法,初始化父类
            $this->school = $school;                  //新添加一条为子类中新声明的成员属性赋初值
        }
        public function say( ) {                        //方法重写(覆盖)
            parent::say();                                    //调用父类中被本方法覆盖掉的方法
            echo "在".$this->school."学校上学<br>";    //在原有的功能基础上多加一点功能
        }   
    }
$student = new Student("张三","男",20, "edu");  //创建学生对象,并多传一个学校名称参数    
$student->say();                                                 //调用学生类中覆盖父类的说话方法

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图