博客列表 >PHP三十天作业-子类继承父类进行方法重载和重写-2018-05-11

PHP三十天作业-子类继承父类进行方法重载和重写-2018-05-11

HeartofSunny的博客
HeartofSunny的博客原创
2018年05月11日 00:47:411225浏览

父类和子类Student.php

<?php

class Students{

    protected $name;
    protected $cls;
    protected $age;

    //定义构造方法
    public function __construct($name,$cls,$age)
    {
        $this->name = $name;
        $this->cls = $cls;
        $this->age = $age;
    }

    public function study()
    {
        return '学习';
    }
}

class Student extends Students{
    //创建查询器,实现了外部访问
    public function __get($pro)
    {
        return $this->$pro;
    }

    //对父类属性进行扩展,增加新的特征
    private $sex;  //性别
    private $hobby; //爱好

    //必须使用构造方法对使用当前新增属性生效
    public function __construct($name,$cls,$age,$sex,$hobby)
    {
        //调用父类构造器初始化类属性
        parent::__construct($name, $cls, $age);
        $this->sex = $sex;
        $this->hobby = $hobby;
    }

    //增加新的方法,扩展父类的功能
    public function sport()
    {
        return '游泳';
    }

    //将父类方法进行重写,就是功能重载,必须使用与父类一样的方法名:call()
    public function study()
    {
        return parent::study().'完后去'.$this->sport();
    }
}

运行实例 »

点击 "运行实例" 按钮查看在线实例

index.php

<?php
//类的继承和重载
//自动加载类文件
spl_autoload_register(function($className){
    require './class/'.$className.'.php';
});

$student = new Student('张三丰','三年级',12,'男','打篮球');
//下面我们换一组数据来初始化对象,验证parent::__contrunctor()
$student = new Student('张无忌','一年级', 10,'女','游泳');

echo '姓名: '.$student->name.'<br>';
echo '年级: '.$student->cls.'<br>';
echo '年龄: '.$student->age. '<br>';
//下面输出二个在子类中扩展的属性
echo '性别:'.$student->sex.'<br>';
echo '爱好:'.$student->hobby.'<br>';

echo $student->study().'<br>'; //study()是父类中的方法
echo $student->sport().'<br>'; //sport()是子类中的方法

运行实例 »

点击 "运行实例" 按钮查看在线实例

总结:

继承
    extends 关键字来继承类
    被继承的类,我们称之为父类
    继承后的类,我们称之为子类
    子类继承父类非私有的属性和方法

    public 在本类,子类,以及类的外部都访问
    protected 保护型的属性,自己以及子类能访问
    private 私有的不能被继承,只能自己访问
    子类可以访问父类的非私有的属性和方法, 使用$this关键字访问

覆盖:子类中声明与父类相同名称的属性和方法,
    属性被覆盖后,就无法访问父类的属性
    方法被覆盖后,依旧可以访问父类的方法 parent::方法名()

final修饰类和方法
    被final修饰的类是不能被继承
    被final修饰的方法不能被子类覆盖

static修饰属性和方法
    属性
        static修改的属性是可以修改的,是所有实例共享,也就是属于类,非静态的是每个对象都会保存一份不一样的
        访问:本类中使用 self::$属性名 父类中使用 parent::$属性名
    方法
        static修饰的方法,它里面只能使用静态属性和静态方法,不能使用普通的属性和普通的方法
        访问:类名::静态方法() self::静态方法()
静态方法和属性的用途,单例设计模式:
    设计模式其实就是前人总结的一些规律
    作为对象的创建模式,单例设计模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局提供这个单例,它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用

接口
    声明
        interface 接口名{
        //方法是不能有实现
            function 方法名();
            }
    实现接口
        class 类名 implements 接口1,接口2{
        //必须要实现接口中定义的方法,否则会报错
        }


抽象类
    声明
        abstract class 类名{
        //抽象类当中也可以包含有实现的方法
        function 方法名(){
            //
        }
            //抽象方法不能有实现,一个抽象类中必须要有一个抽象方法
            abstract function 方法名();
        }
    使用
        class 类 extends 抽象类{
            //实现我们的抽象方法
            function 方法名(){

            }
        }

魔术方法
    __toString 当将对象直接输出时,会调用此魔术方法,此方法返回一个字符串
    __call 当调用的方法不存在时
    __callStatic 当调用的静态方法不存在时
    __get 当访问不存在的属性
    __set 当给不存在的属性赋值时


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议