欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

父类的属性继承与扩展-2018年5月4日8点20

程序员文章站 2024-04-04 22:13:05
...

示意图:

父类的属性继承与扩展-2018年5月4日8点20

重点提示: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()是子类中的方法