7.6.1 PHP类的接轨

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();
?>

输出:

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

如此代码管理起来就会好广大。
若是未来小学生要上学二个新的技能吃东西,小编将来如此写。

<?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类。

办法重写
借使要兑现的三个类有联袂特点,那么就足以将以此合伙的性状抽象出七个父类。
诸如,有小学生类和中学生类,这样的多少个类,他们都以学生,那么就足以抽象出壹个学童类,学生都会考试,那么就把考试那么些点子写在学员那个类里面。
那么难点不怕,小学生是小学生的考查,中学生是中学生的考试,小编不容许都输出考试,那里就用到了艺术重写。
在子类中定义三个与父类一样的办法,那样实践的时候,父类中的方法就会被覆盖,从而输出的唯有子类中定义的主意。
举例:

<?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();
?>

输出:

小学生考试
中学生考试

经过持续可以简化类的定义。

子类与父类的属性与艺术

子类继承父类的全数内容,但父类中的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();                                                 //调用学生类中覆盖父类的说话方法

7.6.1 PHP类的继承

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{
     ....
  }

后续已为大家所熟练的多少个主次设计天性,PHP
的靶子模型也使用了继续。继承将会潜移默化到类与类,对象与目标之间的关系。
例如,当增加2个类,子类就会持续父类的持有国有和护卫方法。可是子类的方法会覆盖父类的格局。
持续对于作用的统筹和浮泛是不行实惠的,而且对于接近的对象增加新职能就不要重新再写这几个公用的效劳。
php继承的严重性字:extends
格式:
[修饰符] class 子类名 extends 父类名{ … }

发表评论

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

网站地图xml地图