子类的三种应用场景
<?php //类的继承: 代码复用的重要手段 namespace _0930; class Demo3 { // 属性(变量) public $product;//商品名称 public $price;//商品价格 // 构造方法 public function __construct($product, $price) { $this->product = $product; $this->price = $price; } // 方法(函数) public function getInfo() { return '商品名称: ' . $this->product.', 商品价格: ' . $this->price; } } // 子类 // 1. 代码复用 class Sub1 extends Demo3 { // ... } $sub1 = new Sub1('iPhone 11', 9800); echo $sub1->getInfo() . '<hr>'; //getInfo将整个数据打印输出 // 子类 // 2. 功能扩展 class Sub2 extends Demo3 { // 增加一个属性 public $num; // 数量 // 构造方法 public function __construct($product, $price, $num) { // $this->product = $product; // $this->price = $price; parent::__construct($product, $price);//相当于调用了父类的构造方法 $this->num = $num; } // 子类中增加一个新方法: 计算总和 public function total() { return round($this->price * $this->num, 3); // 3就是参数就是保留的小数点 } } $sub2 = new Sub2('电脑', 3980.1234, 13); echo $sub2->product . '的总价是: '. $sub2->total(). '<hr>'; // 子类 // 3. 方法重写 //满足个性化需求 class Sub3 extends Sub2 { // 重写total() public function total() { $total = parent::total(); //调用原来未被重写的方法第56行 roud以后 // 设置折扣率 switch (true) { case ($total > 20000 && $total < 40000): $discountRate = 0.88; //折扣率discountRate 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); //折扣价的变量$discountPrice if ($discountRate < 1) { $discountPrice=$discountPrice . '元, <span style="color: red">('. $discountRate.'折)</span>'; } // 返回折扣价 return $discountPrice; } } $sub3 = new Sub3('电脑', 3980, 13); $sub3 = new Sub3('电脑', 3980, 33); echo '折扣价是: ' . $sub3->total(); echo '<hr>'; $sub3 = new Sub3('电脑', 2990, 10); echo '折扣价是: ' . $sub3->total(); echo '<hr>'; --------------------------------------------------------------------------------------------------------------
运行效果图
实例演示类成员的三种访问限制符的使用场景
<?php namespace _0930; // 访问控制符: public // public : 类中,类外均可访问, 子类中也可以访问 // protected: 类中,类外不可访问, 但是子类中可以访问 // private: 只允许在类中, 类外, 子类中不可访问 //访问控制符: public class Demo4 { //类中成员:属性,方法 //成员属性, 成员方法 // 对象属性: 需要使用类的实例进行访问的成员属性 public $name; //姓名 protected $position; //职位 private $salary;//工资 protected $department; //部门 //构造方法 public function __construct($name, $position, $salary, $department) { $this->name = $name ; $this->position = $position; $this->salary = $salary; $this->department = $department; } //职位访问器/方法/函数 public function getPosition() { return $this->position; } //工资访问器/方法/函数 public function getSalary() { //工资 只允许财务部的人看 // if ($this->department === '财务部') // { // return $this->salary; // } // return '无权查看'; //--------------低下是简化版----------------- return $this->department === '财务部' ? $this-> salary : '无权查看'; //?前面是条件:前面代表成功访问: 代表失败返回. } //部门访问器/方法/函数 public function getDepartment() { return $this->department; } } $obj = new Demo4('万物', '学生', 1500, '研发部'); echo $obj->name,'<br>'; //echo $obj->position,'<br>'; echo $obj->getPosition(),'<br>'; //echo $obj->salary; echo $obj-> getSalary(),'<br>'; // echo $obj->department; echo $obj->getDepartment(),'<br>'; class Sub extends Demo4 { public function display() { // return $this->position;// protected // return $this->salary;//private return $this->name;//public } } $sub = new Sub('舞','舞者',6666,'国家队'); echo $sub->display(),'<br>'; ?>
----------------------------------------------------------------------------