PHP物件導向繼承用法詳解

來源:互聯網
上載者:User
這篇文章主要介紹了PHP物件導向繼承用法,結合執行個體形式分析了php物件導向程式設計中繼承的使用方法及代碼最佳化處理與減少代碼重複的相關操作技巧,需要的朋友可以參考下

本文執行個體講述了PHP物件導向繼承用法。分享給大家供大家參考,具體如下:

繼承

先看兩個類


<?phpclass CdProduct {  public $playLength; // 播放時間  public $title;  public $producerMainName;  public $producerFirstName;  public $price;  function __construct(  $title, $firstName,              $mainName, $price,              $playLength ) {    $this->title       = $title;    $this->producerFirstName = $firstName;    $this->producerMainName = $mainName;    $this->price       = $price;    $this->playLength    = $playLength;  }  function getPlayLength() {    return $this->playLength;  }  function getSummaryLine() {    $base = "{$this->title} ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    $base .= ": playing time - {$this->playLength}";    return $base;  }  function getProducer() {    return "{$this->producerFirstName}".        " {$this->producerMainName}";  }}class BookProduct {  public $numPages; // 看的頁數  public $title;  public $producerMainName;  public $producerFirstName;  public $price;  function __construct(  $title, $firstName,              $mainName, $price,              $numPages ) {    $this->title       = $title;    $this->producerFirstName = $firstName;    $this->producerMainName = $mainName;    $this->price       = $price;    $this->numPages     = $numPages;  }  function getNumberOfPages() {    return $this->numPages;  }  function getSummaryLine() {    $base = "{$this->title} ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    $base .= ": page count - {$this->numPages}";    return $base;  }  function getProducer() {    return "{$this->producerFirstName}".        " {$this->producerMainName}";  }}$product1 = new CdProduct("cd1", "bob", "bobbleson", 4, 50 );print $product1->getSummaryLine();print "\n";$product2 = new BookProduct("book1", "harry", "harrelson", 4, 30 );print $product2->getSummaryLine();print "\n";?>


輸出:

cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30

點評:這兩個類,代碼重複性太高,有相同性,也有差異性。不如用繼承來簡化處理。

採用繼承來處理


<?phpclass ShopProduct {  public $numPages;  public $playLength;  public $title;  public $producerMainName;  public $producerFirstName;  public $price;  function __construct(  $title, $firstName,              $mainName, $price,              $numPages=0, $playLength=0 ) {    $this->title       = $title;    $this->producerFirstName = $firstName;    $this->producerMainName = $mainName;    $this->price       = $price;    $this->numPages     = $numPages;    $this->playLength    = $playLength;  }  function getProducer() {    return "{$this->producerFirstName}".        " {$this->producerMainName}";  }  function getSummaryLine() {    $base = "$this->title ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    return $base;  }}class CdProduct extends ShopProduct {  function getPlayLength() { // 增加屬於自己的方法    return $this->playLength;  }  function getSummaryLine() { // 改造了父類的方法    $base = "{$this->title} ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    $base .= ": playing time - {$this->playLength}";    return $base;  }}class BookProduct extends ShopProduct {  function getNumberOfPages() {    return $this->numPages;  }  function getSummaryLine() {    $base = "{$this->title} ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    $base .= ": page count - {$this->numPages}";    return $base;  }}$product1 = new CdProduct("cd1", "bob", "bobbleson", 4, null, 50 );print $product1->getSummaryLine();print "\n";$product2 = new BookProduct("book1", "harry", "harrelson", 4, 30 );print $product2->getSummaryLine();print "\n";?>


輸出:

cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30

點評:繼承處理很好的解決了差異性,相通性問題。

進一步最佳化處理


<?phpclass ShopProduct {  // 抽離出共有屬性  public $title;  public $producerMainName;  public $producerFirstName;  public $price;  function __construct(  $title, $firstName,              $mainName, $price ) {    $this->title       = $title;    $this->producerFirstName = $firstName;    $this->producerMainName = $mainName;    $this->price       = $price;  }  function getProducer() {    return "{$this->producerFirstName}".        " {$this->producerMainName}";  }  function getSummaryLine() {    $base = "{$this->title} ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    return $base;  }}class CdProduct extends ShopProduct {  // 抽離出屬於自己特有的屬性  public $playLength;  function __construct(  $title, $firstName,              $mainName, $price, $playLength ) {    parent::__construct(  $title, $firstName,                $mainName, $price ); // 繼承父類的建構函式    $this->playLength = $playLength; // 處理自己專有的屬性  }  function getPlayLength() {    return $this->playLength;  }  function getSummaryLine() {    $base = "{$this->title} ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    $base .= ": playing time - {$this->playLength}";    return $base;  }}class BookProduct extends ShopProduct {  public $numPages;  function __construct(  $title, $firstName,              $mainName, $price, $numPages ) {    parent::__construct(  $title, $firstName,                $mainName, $price );    $this->numPages = $numPages;  }  function getNumberOfPages() {    return $this->numPages;  }  function getSummaryLine() {    $base = "$this->title ( $this->producerMainName, ";    $base .= "$this->producerFirstName )";    $base .= ": page count - $this->numPages";    return $base;  }}$product1 = new CdProduct("cd1", "bob", "bobbleson", 4, 50 );print $product1->getSummaryLine();print "\n";$product2 = new BookProduct("book1", "harry", "harrelson", 4, 30 );print $product2->getSummaryLine();print "\n";?>


輸出:

cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30

點評:這裡把共有屬性在父類中,其他個性屬性放在自己的類中處理。並設定自己的構造方法,繼承父類的構造方法。

進一步繼承父類的方法


<?phpclass ShopProduct {  public $title;  public $producerMainName;  public $producerFirstName;  public $price;  function __construct(  $title, $firstName,              $mainName, $price ) {    $this->title       = $title;    $this->producerFirstName = $firstName;    $this->producerMainName = $mainName;    $this->price       = $price;  }  function getProducer() {    return "{$this->producerFirstName}".        " {$this->producerMainName}";  }  function getSummaryLine() {    $base = "{$this->title} ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    return $base;  }}class CdProduct extends ShopProduct {  public $playLength;  function __construct(  $title, $firstName,              $mainName, $price, $playLength ) {    parent::__construct(  $title, $firstName,                $mainName, $price );    $this->playLength = $playLength;  }  function getPlayLength() {    return $this->playLength;  }  function getSummaryLine() {    $base = parent::getSummaryLine();    $base .= ": playing time - {$this->playLength}";    return $base;  }}class BookProduct extends ShopProduct {  public $numPages;  function __construct(  $title, $firstName,              $mainName, $price, $numPages ) {    parent::__construct(  $title, $firstName,                $mainName, $price );    $this->numPages = $numPages;  }  function getNumberOfPages() {    return $this->numPages;  }  function getSummaryLine() {    $base = parent::getSummaryLine();    $base .= ": page count - {$this->numPages}";    return $base;  }}$product1 = new CdProduct("cd1", "bob", "bobbleson", 4, 50 );print $product1->getSummaryLine();print "\n";$product2 = new BookProduct("book1", "harry", "harrelson", 4, 30 );print $product2->getSummaryLine();print "\n";?>


輸出:

cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30

點評:同樣的結果,可以最佳化最佳化再最佳化。這裡繼承父類的方法。parent::getSummaryLine()。不過這個用的比較少。

繼續添加一些有意思的內容


<?phpclass ShopProduct {  private $title;  private $discount = 0;  private $producerMainName;  private $producerFirstName;  protected $price;  function __construct(  $title, $firstName,              $mainName, $price ) {    $this->title       = $title;    $this->producerFirstName = $firstName;    $this->producerMainName = $mainName;    $this->price       = $price;  }  function setDiscount( $num ) {    $this->discount=$num;  }  function getPrice() {    return ($this->price - $this->discount);  }  function getProducer() {    return "{$this->producerFirstName}".        " {$this->producerMainName}";  }  function getSummaryLine() {    $base = "{$this->title} ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    return $base;  }}class CdProduct extends ShopProduct {  public $playLength;  function __construct(  $title, $firstName,              $mainName, $price, $playLength ) {    parent::__construct(  $title, $firstName,                $mainName, $price );    $this->playLength = $playLength;  }  function getPlayLength() {    return $this->playLength;  }  function getSummaryLine() {    $base = parent::getSummaryLine();    $base .= ": playing time - {$this->playLength}";    return $base;  }}class BookProduct extends ShopProduct {  public $numPages;  function __construct(  $title, $firstName,              $mainName, $price, $numPages ) {    parent::__construct(  $title, $firstName,                $mainName, $price );    $this->numPages = $numPages;  }  function getPrice() {    return $this->price;  }  function getNumberOfPages() {    return $this->numPages;  }  function getSummaryLine() {    $base = parent::getSummaryLine();    $base .= ": page count - {$this->numPages}";    return $base;  }}$product1 = new CdProduct("cd1", "bob", "bobbleson", 4, 50 );$product1->setDiscount( 3 );print $product1->getSummaryLine();print "\n";print "price: {$product1->getPrice()}\n";$product2 = new BookProduct("book1", "harry", "harrelson", 4, 30 );$product2->setDiscount( 3 ); // 折扣對book無效print $product2->getSummaryLine();print "\n";print "price: {$product2->getPrice()}\n";?>


輸出:

cd1 ( bobbleson, bob ): playing time - 50
price: 1
book1 ( harrelson, harry ): page count - 30
price: 4

點評:父類添加了折扣,book繼承之後,修改了getPrice方法,所以折扣對book無效。

私人化屬性,通過方法來設定與擷取


<?phpclass ShopProduct {  // 私人化屬性,通過方法來設定與擷取  private $title;  private $producerMainName;  private $producerFirstName;  protected $price;  private $discount = 0;  public function __construct(  $title, $firstName,              $mainName, $price ) {    $this->title       = $title;    $this->producerFirstName = $firstName;    $this->producerMainName = $mainName;    $this->price       = $price;  }  public function getProducerFirstName() {    return $this->producerFirstName;  }  public function getProducerMainName() {    return $this->producerMainName;  }  public function setDiscount( $num ) {    $this->discount=$num;  }  public function getDiscount() {    return $this->discount;  }  public function getTitle() {    return $this->title;  }  public function getPrice() {    return ($this->price - $this->discount);  }  public function getProducer() {    return "{$this->producerFirstName}".        " {$this->producerMainName}";  }  public function getSummaryLine() {    $base = "{$this->title} ( {$this->producerMainName}, ";    $base .= "{$this->producerFirstName} )";    return $base;  }}class CdProduct extends ShopProduct {  private $playLength = 0;  public function __construct(  $title, $firstName,              $mainName, $price, $playLength ) {    parent::__construct(  $title, $firstName,                $mainName, $price );    $this->playLength = $playLength;  }  public function getPlayLength() {    return $this->playLength;  }  public function getSummaryLine() {    $base = parent::getSummaryLine();    $base .= ": playing time - {$this->playLength}";    return $base;  }}class BookProduct extends ShopProduct {  private $numPages = 0;  public function __construct(  $title, $firstName,              $mainName, $price, $numPages ) {    parent::__construct(  $title, $firstName,                $mainName, $price );    $this->numPages = $numPages;  }  public function getNumberOfPages() {    return $this->numPages;  }  public function getSummaryLine() {    $base = parent::getSummaryLine();    $base .= ": page count - {$this->numPages}";    return $base;  }  public function getPrice() {    return $this->price;  }}$product1 = new CdProduct("cd1", "bob", "bobbleson", 4, 50 );print $product1->getSummaryLine()."\n";$product2 = new BookProduct("book1", "harry", "harrelson", 4, 30 );print $product2->getSummaryLine()."\n";?>


輸出:

cd1 ( bobbleson, bob ): playing time - 50
book1 ( harrelson, harry ): page count - 30

點評:這裡進一步私人化了屬性,要想擷取只能通過方法。這樣就確保了安全性。


以上就是本文的全部內容,希望對大家的學習有所協助。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.