PHP类的继承
每个子类(也叫派生类)都会在设置自己的属性前调用父类的构造方法。父类(也叫基类或超类)现在仅知道自己的数据,子类一般是父类的特例,要避免告诉父类任何关于子类的信息
以下为一个使用继承的实例:
<?php
class ShopProduct{
private $title; // 属性也称为成员变量,用来存放对象之间互不相同的数据
private $producerMainName; // 所有的属性都设置为 private,不允许外部直接访问这些属性,然后提供方法来取得需要的值
private $producerFirstName;
protected $price; // 阻止外面直接访问该属性,可以被子类访问
private $discount = 0;
// 创建对象时,构造方法会被自动调用,构造方法可以确保必要的属性设置,并完成任何需要准备的工作
public function __construct($title,$mainName,$firstName,$price){
$this->title = $title; // 使用伪变量$this给每个变量赋值
$this->producerMainName = $mainName;
$this->producerFirstName = $firstName;
$this->price = $price;
}
/**
* @return mixed 这种只返回属性值的方法称为“访问方法”,也称为 getter 和 setter
*/
public function getProducerFirstName()
{
return $this->producerFirstName;
}
/**
* @return mixed 获取 姓 的访问方法
*/
public function getProducerMainName()
{
return $this->producerMainName;
}
/**
* @param $num 打折的价格
*/
public function setDiscount($num)
{
$this->discount = $num;
}
/**
* @return int 折扣的访问方法
*/
public function getDiscount()
{
return $this->discount;
}
/**
* @return mixed Book名或CD名的访问方法
*/
public function getTitle()
{
return $this->title;
}
/**
* @return mixed 折扣后的价格
*/
public function getPrice()
{
return ($this->price - $this->discount);
}
/**
* @return string 作者
*/
public function getProducer(){ // 方法让对象执行任务
return $this->producerMainName .' '. $this->producerFirstName;
}
/**
* @return string 发票的摘要信息
*/
public function getSummaryLine()
{
$base = "{$this->title} ( {$this->producerMainName},{$this->producerFirstName}) ";
return $base;
}
}
// 若派生类没有定义构造方法,则它在实例化是会自动调用父类的构造方法。子类默认继承父类所有的 public 和 protected 方法,但不继承 private 方法和属性
class BookProduct extends ShopProduct
{
private $numPages;
// 每个子类在设置自己的属性前调用父类的构造方法,基类现在仅知道自己的数据,子类一般是父类的特列,应该避免告诉父类任何关于子类的消息。
public function __construct($title,$mainName,$firstName,$price,$numPages)
{
// parent 关键字可以在任何复写父类方法的方法中使用,通过在当前对象中调用父类的方法来拓展父类的功能 , 要应用一个类而不是对象的方法,使用 :: 而不是 ->
parent::__construct($title,$mainName,$firstName,$price);
$this -> numPages = $numPages;
}
/**
* @param $numPages 书的页数
* @return mixed 总页数
*/
public function getNumberOfPages()
{
return $this->numPages;
}
/**
* 子类(派生类)可以覆盖和修改父类(基类或超类)的功能
* @return string Book发票的摘要信息
*/
public function getSummaryLine()
{
$base = parent::getSummaryLine();
$base .= "page count - {$this->numPages}";
return $base;
}
}
class CdProduct extends ShopProduct
{
private $playLength;
public function __construct($title,$mainName,$firstName,$price,$playLength)
{
parent::__construct($title,$mainName,$firstName,$price);
$this -> playLength = $playLength;
}
/**
* @return int 播放时间
*/
public function getPlayLength()
{
return $this -> playLength;
}
/**
* @return string CD发票的摘要信息
*/
public function getSummaryLine()
{
$base = parent::getSummaryLine();
$base .= "playing time - {$this->playLength}";
return $base;
}
}
$product1 = new BookProduct('Kong Yiji','Lun','Xun',59.9,200);
$product2 = new CdProduct('The Saltwater Room','Owl','City',10.99,4);
print "author : {$product1 -> getProducer()} </br>"; // author :Lun Xun
print "book summary line: {$product1 -> getSummaryLine()}</br>"; // book summary line :Kong Yiji ( Lun,Xun) page count - 200
print "artist : {$product2 -> getProducer()} </br>"; // artist :Owl City
print "play length :{$product2 ->getPlayLength()}</br>"; // play length :4
本文是我阅读了《深入PHP 面向对象、模式与实践》一书的第三章中关于继承的部分后所作
如有转载,请注明出处:http://www.cnblogs.com/chrdai/p/6860818.html