实例演示子类的三个应用场景;实例演示类成员的三种访问限制符的使用场景
复习面向对象开发中的静态成员,类常量,属性重载,方法重载,抽象成员,接口知识;
实例说明:
1、创建一个汽车类,包含成员属性有:***、型号、价格,且价格为私有属性;
包含的成员方法:run()和价格访问器getprice($user),根据$user身份决定是否显示价格;
2、从汽车类中派生一个子类Power_car,用来表明汽车的动力源;
Power_car子类继承父类Car的所有属性和方法;
在子类中,可以实现代码复用:比如实例中的__construct()方法,或使用父类的成员方法;
可以实现功能扩展:比如在子类中新增$power属性和powerby()方法;
可以实现代码重写:比如子类中对run()方法进行重写。
3、实例中使用了三种访问控制符:public、private、protected;
使用访问控制符的主要作用是防止外部非正常的访问,污染类中的成员属性或方法,所有对private、protected保护的类属性进行访问时,都需要经过“访问控制器”的管控。
三种访问控制符的使用场景为:
public : 类内外、子类中都可以访问 ;
protected: 类中和子类中都可以访问,但类外不可以;
private: 仅在类中可以,类外不和 子类中不可以访问
实例代码如下:
实例 <?php 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 '<br>'; echo $obj->getprice('访客'); echo '<hr>'; //定义一个子类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(), '<br>'; echo $obj->run(), '<br>'; echo $obj->getprice('会员'), '<br>'; echo '<hr>'; ?> 运行实例 » 点击 "运行实例" 按钮查看在线实例
总结:
1、练习并初步掌握类的封装、继承和多态;
2、熟悉了子类的代码复用、功能扩展、代码重写,以及访问控制符的使用场景;
3、需要注意:子类重写父类方法时,一定要 高于或等于 父类被覆盖方法的访问权限;
疑问:类中被声明为private的方法,在外部用什么方法可以使用??