php子类的应用场景:分别是代码的复用, 功能扩展和方法重写.
基类代码
实例
class mobile{ public $product; public $price; public $model; public function __construct($product,$price){ $this->product = $product; $this->price = $price; } public function getinfo(){ return '商品名称: '. $this->product . '商品价格: '.$this->price; } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
1. 代码复用,继承基类
实例
//代码的复用 class sub1 extends mobile { } $sub = new sub1('huawei Mate30',3500); echo $sub->getinfo();
运行实例 »
点击 "运行实例" 按钮查看在线实例
2. 功能扩展,添加一个计算价格的方法
实例
//功能扩展 class sub2 extends mobile{ //增加一个成员属性 public $num; public function __construct($product,$price,$num){ parent::__construct($product,$price); $this->num = $num; } //子类增加一个计算总和的新方法 public function total(){ //round()函数,保留两位小数 return round($this->price * $this->num, 2); } } $sub2 = new sub2('huawei Mate30',3500.1126, 5); echo $sub2->product.'总价是'.$sub2->total();
运行实例 »
点击 "运行实例" 按钮查看在线实例
3. 方法重写,添加商品价格打折优惠
实例
//方法重写 class sub3 extends sub2{ //重写sub2里面的方法 public function total(){ $total = parent::total(); //设置折扣率 switch (true){ case($total > 20000 && $total <40000): $discountRate = 0.88; break; case($total >= 40000 && $total <60000): $discountRate = 0.88; break; case($total >= 60000): $discountRate = 0.68; break; default: $discountRate = 1; } //打折后的价格 $discountPrice = round($total*$discountRate,2); if($discountRate<1){ $discountPrice = $discountPrice . '元,<span style="color:red;">(折扣:'.$discountRate.'折)</span><hr>'; } return $discountPrice; } } $sub3 = new sub3('电脑',3500,10); echo '价格'.$sub3->total();
运行实例 »
点击 "运行实例" 按钮查看在线实例
类的成员限制符有三种,用来修饰类成员的访问权限,分别是:
public(公共的、默认) :该成员能被外部代码访问和操作;
protected(受保护的): 对于类内部所有成员都可见,对类外部不允许访问,子类中可以访问;
private(私有的):该类型的属性或方法只能在该类中使用;
实例
<?php namespace company; class demo { public $name; //公共的属性 姓名 protected $position; //受保护的属性 职位 protected $department; //受保护的属性 部门 private $salary; //私有属性 工资 //类里面的构造方法,自动调用,公共属性 public function __construct($name, $postion, $department, $salary){ //类里面自动调用,传参数给赋值给属性,三个属性类中都可以直接访问 $this->name = $name; $this->position = $postion; $this->department = $department; $this->salary = $salary; } //职位访问方法,职位属性是受保护的,类中可以访问 public function getPosition(){ //三元运算符,判断职位是否为讲师 return $this->position === '讲师' ? '讲师:'.$this->name : '无权查看'; } //部门的访问属性方法 public function getDepartment(){ return $this->department; } //部门属性访问方法,类中可访问 //工资的属性访问方法,只允许财务访问 public function getSalary(){ return $this->department === '财务部' ? $this->salary : '无权查看'; } } $obj = new demo('peter','讲师','培训部',9999); echo $obj->getPosition().'<br>'; echo $obj->name.'<br>'; //echo $obj->department.'<br>'; //受保护的成员属性,外部调用会报错 //echo $obj->salary.'<br>'; //私有成员属性,外部调用会报错 echo $obj->getSalary().'<br>'; $obj2 = new demo('朱老师','会计','财务部',8888); echo $obj2->getSalary().'<br>'; //echo $obj2->salary; //私有成员属性,外部调用会报错 //子类继承基类 class subdemo extends demo { public function display(){ //return $this->name; //公共属性,子类可以调用 //return $this->position; //受保护的属性,子类可以调用 return $this->salary; //私有属性,子类中不能调用,无法访问 } } $obj3 = new subdemo('欧阳老师','讲师','培训部',9999); echo $obj3->display(); ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
子类的应用,类成员的三种访问的使用场景
小结:php子类的应用场景很灵活,可以增加和扩展父类的属性和功能,构造方法 __construct 可以在创建对象的时候自动调用,在子类中使用父类中的构造方法用关键字 parent:: 表示 。protected 受保护的属性,内部成员和子类都可以访问,而private 私有属性只能在该类中使用,不能继承使用。