博客列表 >子类的应用和类成员的三种访问的使用场景--2019-9-30

子类的应用和类成员的三种访问的使用场景--2019-9-30

木槿昔年的博客
木槿昔年的博客原创
2019年10月08日 14:43:10655浏览

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 私有属性只能在该类中使用,不能继承使用。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议