ホームページ  >  記事  >  バックエンド開発  >  PHPクラスの継承を使用してコードの重複を解決する方法

PHPクラスの継承を使用してコードの重複を解決する方法

伊谢尔伦
伊谢尔伦オリジナル
2017-06-30 10:43:531416ブラウズ

この記事では、コードの重複の問題を解決するための PHP のクラスの使用方法を主に紹介します。その例では、継承の原理と使用テクニックを分析しています。必要な方は参考にしてください。この記事の例では、PHP でのクラス継承の使用法について説明し、コードの重複の問題を解決します。皆さんの参考に共有してください。具体的な分析は次のとおりです。

継承とは、単にクラスに 1 つ以上のサブクラスを作成することを意味します。サブクラスを作成するには、クラス宣言で

extends

キーワードを使用する必要があります。中央、親クラスの名前が最後に来ます。

次の例では、BookProduct と Cdproduct という 2 つの新しいクラスを作成します。どちらも ShopProduct クラスを継承します。

<?php
header(&#39;Content-type:text/html;charset=utf-8&#39;);
// 从这篇开始,类名首字母一律大写,规范写法
class ShopProduct{    // 声明类
 public $numPages;   // 声明属性
 public $playLenth;
 public $title; 
 public $producerMainName;
 public $producerFirstName;
 public $price;
 function construct($title,$firstName,$mainName,$price,$numPages=0,$playLenth=0){
  $this -> title = $title;    // 给属性 title 赋传进来的值
  $this -> producerFirstName= $firstName; 
  $this -> producerMainName = $mainName; 
  $this -> price= $price; 
  $this -> numPages= $numPages; 
  $this -> playLenth= $playLenth; 
 }
 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 cont - {$this->numPages} )";
  return $base;
 }
}
?>


サブクラスは

コンストラクター

を定義していないため、BookProductクラスとCdproductクラスがインスタンス化されると、親クラスShopProductのコンストラクターが自動的に呼び出されます。
サブクラスは、デフォルトで親クラスのすべてのパブリックおよびプロテクトされたメソッドとプロパティを継承します (ただし、プライベート メソッドとプロパティは継承しません。これら 3 つのキーワードの機能については後で説明します)。つまり、getProducer() が ShopProduct クラスで定義されている場合でも、Cdproduct クラスからインスタンス化されたオブジェクトで getProducer() メソッドを呼び出すことができます。

上記に次のコードを追加します:

$product2 = new CdProduct("PHP面向对象","郭","碗瓢盆",7,null,"7小时");
print "美好生活:{$product2 -> getProducer()}<br>";
// 结果是:美好生活:郭碗瓢盆

両方のサブクラスは親クラスの共通部分を継承しますが、BookProduct クラスと Cdproduct クラスの両方が getsummaryLine() メソッドをオーバーライドして、独自の一意の実装を提供し、サブクラスがクラスは、親クラスの機能を拡張および変更できます。

しかし、親クラスでのこのメソッドの実装は少し冗長に思えます。その理由は、その両方のサブクラスがこのメソッドをオーバーライドしますが、他のサブクラスがその基本機能を使用する可能性があるためです。このメソッドの存在により、クライアント コードの保証が提供されます。すべての ShopProduct オブジェクトには getsummaryLine() メソッドがあり、BookProduct と CDproduct の両方は、それぞれの getsummaryLine() メソッドを使用して $title プロパティにアクセスします。

おそらく最初は、継承は理解するのが簡単ではない概念です。まず、他のクラスを継承するクラスを定義することで、クラスがそのクラスの自由な機能と親クラスの機能を確実に持つことがわかります。次に、サブクラスの「検索」関数があります。$product2 -> getProducer() を呼び出すと、CdProduct クラスで getProducer() メソッドが見つかりません。次に、ShopProduct クラスでこのメソッドを探して呼び出します。そうでない場合は、エラーが報告されます。プロパティへのアクセスについても同様です。


ShopProduct のコンストラクターを見ると、基本クラス (親クラス) のサブクラスによって処理されるデータをまだ管理していることがわかります。BookProduct は $numPages パラメーターと属性を処理する必要があり、Cdproduct は $playLength を処理する必要があります。パラメータと属性。これを実現するには、サブクラス内で個別にコンストラクターを定義する必要があります。

以上がPHPクラスの継承を使用してコードの重複を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。