7.6.1 PHP类的存续

发布时间:2019-02-14  栏目:Python  评论:0 Comments

PHP继承

那是一篇迟来的立异,因为它应当在前两日就被更新了,不过出于我塞尔维亚语四级没过!没过!没过!导致自个儿心思消沉,所以就玩了几天的玩乐,哦不,举行了几天反思,痛定思痛
痛何如哉!

以下都是本身个人的明亮,有错的地点还望不吝赐教。
为什么须求继续?
两次三番就是 二个子类通过extends父类把父类的质量和情势继承下去。
假若以往近来亟需写多个类,小学生类和高中生类,小学生会说话,走路,考试,高中生也会讲话走路,考试,那么一旦您写一回说话,走路,考试,那么就会来得臃肿,管理起来也会麻烦很多,假设定义3个类叫做学生类富含说话,走路,考试,然后让小学生类和高中生类来继承那么些学生类就会来得好广大,比如那样。

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

输出:

小学生考试
中学生考试

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地图