子类的三个应用场景
实例
<?php //类的继承: 代码复用的重要手段 namespace _0930; class demo1 { // 属性(变量) public $product; public $price; // 构造方法 public function __construct($product, $price) { $this->product = $product; $this->price = $price; } // 方法(函数) public function getInfo() { return '名称: ' . $this->product.',数量:1台'.', 价格: ' . $this->price; } } // 继承子类 // 1. 代码复用 , class j1 extends Demo1 { // ... } $j1 = new j1('手机', 2800); echo $j1->getInfo() . '<hr>'; // 2. 功能扩展 添加属性 class j2 extends Demo1{ // 增加一个属性 public $num; // 数量 // 构造方法 public function __construct($product, $price, $num) { parent::__construct($product, $price);//继承父类的构造方法 $this->num = $num; } // 子类中增加一个新方法: 计算总和 public function total() { return round($this->price * $this->num, 3); } } $j = new j2('手机', 2800, 10); echo $j->num .'台'. $j->product . '的总价是: '. $j->total(). '<hr>'; // 子类 // 3. 方法重写 方法修改 class j3 extends j2 { // 重写total() public function total() { $total = parent::total(); // 设置折扣率 switch (true) { case ($total > 20000 && $total < 40000): $discountRate = 0.88; break; case ($total >= 40000 && $total < 60000): $discountRate = 0.78; break; case ($total >= 60000): $discountRate = 0.68; break; default: // 小于或等于2000,不打折 $discountRate = 1; } // 打折后的价格 $discountPrice = round($total*$discountRate, 2); if ($discountRate < 1) { $discountPrice=$discountPrice . '元, <span style="color: red">('. $discountRate.'折)</span>'; } // 返回折扣价 return $discountPrice; } } $j3 = new j3('手机', 2800, 10); echo $j3->num .'台'.$j3->product.'的打折价是: ' . $j3->total(); ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
类成员的三种访问限制符
public全局可以访问
实例
<?php class demo1{ public $name='jerry'; // 名称 protected $position='语文老师'; // 职位 private $salary='5000'; // 工资 } $demo1 = new demo1(); echo $demo1->name; echo $demo1->psition; echo $demo1->salary;
运行实例 »
点击 "运行实例" 按钮查看在线实例
protected: 类中,类外不可访问, 但是子类中可以访问
实例
<?php class demo1{ public $name; // 名称 protected $position; // 职位 private $salary; // 工资 public function __construct($name,$position,$salary) { $this->name = $name; $this->position = $position; $this->salary = $salary; } public function getName() { return $this->name; } public function getPosition() { return $this->position; } public function getSalary() { return $this->salary; } } $demo1 = new demo1('Jerry','教师',5555); echo $demo1->name; echo '<hr>'; // echo $demo1->position; // echo $demo1->salary; class demo2 extends Demo1 { public function display() { return $this->position; // protected // return $this->salary; // private } } $obj = new Demo2('pertzhu', '讲师', 8888); echo $obj->display(), '<br>';
运行实例 »
点击 "运行实例" 按钮查看在线实例
private: 只允许在类中, 类外, 子类中不可访问
实例
<?php class demo1{ public $name; // 名称 protected $position; // 职位 private $salary; // 工资 public function __construct($name,$position,$salary) { $this->name = $name; $this->position = $position; $this->salary = $salary; } public function getName() { return $this->name; } public function getPosition() { return $this->position; } public function getSalary() { return $this->salary; } } $demo1 = new demo1('Jerry','教师',5555); echo $demo1->name; echo '<hr>'; // echo $demo1->position; // echo $demo1->salary; class demo2 extends Demo1 { public function display() { // return $this->position; // protected return $this->salary; // private } } $obj = new Demo2('pertzhu', '讲师', 8888); echo $obj->display(), '<br>';
运行实例 »
点击 "运行实例" 按钮查看在线实例
总结:
子类可以继承父类的所有代码,写法:class j2(子类名) extends(继承关键词) Demo1(父类名){ },parent::(父类方法名) 可用于调用父类中定义的成员方法。.
目前学到的访问控制符有三种:
public : 类中,类外均可访问, 子类中也可以访问
protected: 类中,类外不可访问, 但是子类中可以访问
private: 只允许在类中, 类外, 子类中不可访问