Blogger Information
Blog 55
fans 0
comment 1
visits 42199
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
父类的属性继承与扩展-2018年5月4日8点20
旺小舞的博客
Original
761 people have browsed it

示意图:

5-4.jpg

重点提示:protected 只能在本类或子类使用,初始化函数必须使用构造方法 __construct(),子类继承父类使用extends,子类的作用是继承和重载父类的某些功能,外部访问需创建查询器__get(),调用使用::,自动加载函数spl_autoload_register(function($className){},

父类.php

<?php

/**
 * protected 只能在本类或子类使用的类成员
 */
class MobilePhone
{
    protected $brand;   ///品牌
    protected $model;   ///型号
    protected $price;
    
    //构造方法
    public function __construct($brand,$model,$price)
    {
        $this->brand = $brand;
        $this->model = $model;
        $this->price = $price;
    }
    
    public function call()  ///创建call()方法
    {
        return '打电话';
    }
}

子类.php


<?php

/**
 * 1.类继承:在子类上使用关键字extends
 * 2.php不支持多继承,仅允许从一个父类上继承        
 * 3.父类又叫超类或基类,通常只提供一些最基本的功能  MobilePhone(父类,超类,基类)
 * 4.子类又叫派生类,可以继承父类中的公共和受保护的成员
 * 
 * 子类的功能是用来扩展或重载父类的某些功能
 */

class SmartPhone extends MobilePhone
{
    //1.无需任何代码,父类MobilePhone中的所有公共和受保护的成员,在当前类中可以直接访问
    
    
    //创建查询器,实现了外部访问
    public function __get($name)
    {
        return $this->$name;
    }
    
    //1.对父类属性进行扩展,增加新的特征,如果不在子类中使用,推荐设置为private
    private $camera = false;  //是否有照相功能
    private $internet = false; //是否有上网功能
    
    //必须使用构造方法对使用当前新增属性生效,对属性进行初始化,要用构造器
    public function __construct($brand,$model,$price,$camera,$internet)
    {
        //调用父类构造器初始化类属性
        parent::__construct($brand, $model, $price);
        
        $this->camera = $camera;
        $this->internet = $internet;
    }
    
    //2.增加新的方法,扩展父类的功能
    public function game()
    {
        return '玩游戏';
    }
    
    //3.将父类方法进行重写,就是功能重载,必须使用与父类一样的方法名:call()
    public function call()
    {
        //但更多的时候,我们并不会放弃原有功能,而只是在它上面进行追回而已
        //那么,如何在子类中引用父类中的方法呢? 使用关键字: parent,后面跟上双冒号::
        return parent::call().',同时还能听歌,看视频';
    }
    
    
    
}

调用.php


<?php
header("Content-type:text/html;charset=utf-8");
/* 
 * 父类的继承与方法重载
 */

//使用自动加载器来加载类:(简写版)
spl_autoload_register(function($className){
    require './class/'.$className.'.php'; 
});

/**
 * 如果才能正常访问这些属性呢?
 * 有二个方案来实现
 * 1.将父类MobilePhone中的相关属性的访问控制全部设置为public
 * 2.将父类MobilePhone中的相关属性的访问控制全部设置为protected,并在子类SmartPhone中创建查询器
 * 我们采用第二种方案
 */


$smartPhone = new SmartPhone('HUAWEI','P20', 5488,true,true);
//下面我们换一组数据来初始化对象,验证parent::__contrunctor()
$smartPhone = new SmartPhone('MI','MIX2', 3599,true,true);



echo '品牌: '.$smartPhone->brand.'<br>'; 
echo '型号: '.$smartPhone->model.'<br>'; 
echo '价格: '.$smartPhone->price. '<br>';

//下面输出二个在子类中扩展的属性 三维运算
echo '照相:'.($smartPhone->camera?'支持':'没有').'<br>';
echo '上网:'.($smartPhone->internet?'支持':'没有').'<br>';

echo $smartPhone->call().'<br>'; //call()是父类中的方法
echo $smartPhone->game().'<br>'; //game()是子类中的方法


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