Blogger Information
Blog 48
fans 0
comment 0
visits 40722
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
构造方法,子类继承,访问控制--2019年09月30日20时00分
小星的博客
Original
724 people have browsed it

构造方法

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

语法如下,其中 $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 是最严格的访问控制。
Correction status:qualified

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