批改状态:合格
老师批语:这三种是最常用的场景 , 但并非只有这三个, 在实际工作中, 你或许还会遇到其它场景 , 但是原理都是一样的
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 私有属性只能在该类中使用,不能继承使用。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号