批改状态:合格
                        老师批语:这么多天的作业, 压了不少
                    
                            构造方法
构造方法又叫魔术方法,是类在实例化过程中自动触发的方法,即类的初始化。
语法如下,其中 $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
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号