博客列表 >构造方法,子类继承,访问控制--2019年09月30日20时00分

构造方法,子类继承,访问控制--2019年09月30日20时00分

小星的博客
小星的博客原创
2019年10月26日 05:53:30723浏览

构造方法

构造方法又叫魔术方法,是类在实例化过程中自动触发的方法,即类的初始化。

语法如下,其中 $this表示为当前对象的引用,就理解为该类实例化后的对象。

构造函数不光只可以初始化属性,还可以初始化方法。

class Demo2 {
    public $name;
    public $age;
    //构造方法
    //又叫魔术方法
    // 系统自动触发的方法
    public function __construct($name,$age)
    {
        // 作用:用来初始化对象的状态,这个状态由属性决定
        $this->name = $name;
        $this->age = $age;

        // 完成对象创建时的自动化操作
        // 自动执行 getName() 函数
        $this->getName();
    }
    public function getName(){
        return  $this->name;
    }
}

$people = new Demo2('zmx',24);

子类继承

实现子类继承使用 extends 关键字。

子类继承一般有以下三个场景使用。

    先定义个父类:

class Fruit {
    public $name;
    public $price;

    public function __construct($name,$price)
    {
        $this->name = $name;
        $this->price = $price;
        $this->getName();
    }
    public function getName(){
        return $this->name;
    }
    public function getPrice(){
        return $this->price;
    }
}

1.  代码复用:复用父类中成员

class Apple extends Fruit {
    // 1. 代码复用
    // ...
}
$apple1 = new Apple('苹果',100);
echo $apple1->getName(); // 这里看到父类中成员全部被子类继承了

2. 子类中功能扩展,在子类中定义新属性方法

class Peach extends Fruit {
    // 2. 功能扩展
    public $place; // 新增属性

    public function __construct($name, $price, $place)
    {
        在父类的构造函数基础上加入新的属性
        parent::__construct($name, $price);
        $this->place =  $place;
    }
    // 这里扩展一个 intro 方法
    public function intro(){
        return '果名:'.$this->name.'价格:'.$this->price.'产地:'.$this->place;
    }
}
$peach1 = new Peach('水蜜桃','19','阳山');
echo $peach1->intro();

3. 改写父类中方法


class Grape extends Fruit {
    public $season;
    public function __construct($name, $price, $season)
    {
        parent::__construct($name, $price);
        $this->season = $season;
    }

    // 3. 方法改写
    public function getName()
    {
        $name = parent::getName();
        return $name.':水果之王';
    }

    public function getPrice() // 改写getPrice()方法,加点判断进去
    {
        $price = parent::getPrice();
        // 旺季涨价,淡季减价
        if($this->season == '旺季') {
            $newPrice = $price * 1.2;
        }else if ($this->season == '淡季'){
            $newPrice = $price * 0.7;
        }
        return $newPrice;
    }
}
$grape1 = new Grape('葡萄','100','旺季');
echo $grape1->getName();
echo $grape1->getPrice();


访问控制符

 public   类中类外都可以访问,子类也可以访问 
 protected  
类中可以访问,类外不能访问,子类可以访问
 private   
只允许在自己类中使用,类外子类都不行,这是最严格的

class People
{
    public $name;
    protected $sex;
    private $age;

    public function __construct($name, $sex, $age)
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }

    public function getSex()
    {
        return $this->sex;
    }

    public function getAge()
    {
        return $this->age;
    }
}

$guy = new People('Tom', 'male', 23);
echo $guy->name; // public 可以直接访问
echo $guy->getSex(); // protected 类中可以访问,类外没法访问
echo $guy->getAge(); // private 类中可以访问,类外没法访问


class Son extends People {
    function getSex(){
        return $this->sex;
    }
    function getAge()
    {
        // return $this->age; // 没法访问父类中 private 成员
    }
}
$son = new Son('Jack','male',78);
echo $son->getSex();  // 可以在子类中访问到 protected
echo $son->getAge();  // 不可以在子类中访问到 pivate
可以看到 private 是最严格的访问控制。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议