实例演示子类的三个应用场景;实例演示类成员的三种访问限制符的使用场景
复习面向对象开发中的静态成员,类常量,属性重载,方法重载,抽象成员,接口知识;
实例说明:
1、创建一个汽车类,包含成员属性有:***、型号、价格,且价格为私有属性;
包含的成员方法:run()和价格访问器getprice($user),根据$user身份决定是否显示价格;
2、从汽车类中派生一个子类Power_car,用来表明汽车的动力源;
Power_car子类继承父类Car的所有属性和方法;
在子类中,可以实现代码复用:比如实例中的__construct()方法,或使用父类的成员方法;
可以实现功能扩展:比如在子类中新增$power属性和powerby()方法;
可以实现代码重写:比如子类中对run()方法进行重写。
3、实例中使用了三种访问控制符:public、private、protected;
使用访问控制符的主要作用是防止外部非正常的访问,污染类中的成员属性或方法,所有对private、protected保护的类属性进行访问时,都需要经过“访问控制器”的管控。
三种访问控制符的使用场景为:public : 类内外、子类中都可以访问 ;
protected: 类中和子类中都可以访问,但类外不可以;
private: 仅在类中可以,类外不和 子类中不可以访问
实例代码如下:实例
namespace com\php\www;
//声明一个汽车类Car
class Car {
//三个类成员属性:
//访问控制符:public:类中、类外、子类均可访问;
// private:仅类中可以访问,类外和子类都不能访问;
// protected:类中和子类可以访问,但类外不可访问;
public $brand;
public $type;
private $price;
//构造方法:在实例化时自动执行,可在此初始化对象,或完成一些需要自动执行的操作;
public function __construct($brand, $type, $price) {
//类中对对象的引用,使用伪变量$this;
//对类自身的引用,使用关键字 self;
$this->brand = $brand;
$this->type = $type;
$this->price = $price;
}
//定义一个类成员方法
public function run() {
return '汽车 可以跑';
}
//价格访问器:定义一个成员方法,用来访问private的成员属性,可在此增加相应的限制条件
public function getprice($user) {
return ($user === '会员') ? ($this->brand . '-' . $this->type . ' 价格:' . $this->price) : '无权查看!';
}
}
$obj = new Car('奥迪', 'Q5', 320000);
echo $obj->run();
echo '
';
echo $obj->getprice('访客');
echo '
';
//定义一个子类Power_car,继承和扩展父类的方法
class Power_car extends Car {
protected $power;
//构造方法的扩展,增加一个$power,动力属性
public function __construct($brand, $type, $price, $power) {
parent::__construct($brand, $type, $price);
$this->power = $power;
}
//为子类新增一个方法powerby(),说明汽车使用什么能源驱动;
public function powerby() {
return (empty($this->power) ? '未知能源类型' : $this->power) . ' 汽车';
}
//run()方法重写
public function run() {
switch (true) {
case $this->power === '汽油':
return '汽车 加“汽油” 就可以跑';
break;
case $this->power === '电动':
return '汽车 充“电” 就可以跑';
break;
default:
return '汽车 使用未知的能源类型';
break;
}
}
}
$obj = new Power_car("奔驰", "GLC300", 500000, "汽油");
echo $obj->powerby(), '
';
echo $obj->run(), '
';
echo $obj->getprice('会员'), '
';
echo '
';
?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
总结:
1、练习并初步掌握类的封装、继承和多态;
2、熟悉了子类的代码复用、功能扩展、代码重写,以及访问控制符的使用场景;
3、需要注意:子类重写父类方法时,一定要 高于或等于 父类被覆盖方法的访问权限;
疑问:类中被声明为private的方法,在外部用什么方法可以使用??