批改状态:合格
老师批语:总结的不错, 在项目要灵活应用
子类的三个应用场景
<?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: 只允许在类中, 类外, 子类中不可访问
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号