Blogger Information
Blog 42
fans 3
comment 2
visits 32360
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP三十天作业-子类继承父类进行方法重载和重写-2018-05-11
HeartofSunny的博客
Original
1235 people have browsed it

父类和子类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 当给不存在的属性赋值时


Correction status:Uncorrected

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post