ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト モデルの抽象メソッドと抽象クラスに関する基本チュートリアル

PHP オブジェクト モデルの抽象メソッドと抽象クラスに関する基本チュートリアル

伊谢尔伦
伊谢尔伦オリジナル
2017-07-03 09:21:461193ブラウズ

オブジェクト指向 PHP などの単一継承言語では、クラスの継承は 1 つ以上のサブクラスを持ち、各サブクラスはそれを継承します。 1 つ以上のサブカテゴリ。もちろん、異なる機能を実装するために複数のルート クラスが使用される場合もあります。適切に設計されたシステムでは、各ルート クラスに、アプリケーション コードで使用できる便利なインターフェイスが必要です。アプリケーション コードがルート クラスで動作するように設計されている場合は、ルート クラスを継承するサブクラスでも動作できます。

抽象メソッドは、サブクラス内の一般的なメソッドのプレースホルダーのようなものです(場所を占めますが、機能しません)。一般的なメソッドとは異なり、コードはありません。クラス内に 1 つ以上の抽象メソッドがある場合、そのクラスは 抽象クラス になります。抽象クラスをインスタンス化することはできません。抽象クラスを継承してからサブクラスをインスタンス化する必要があります。また、抽象クラスをサブクラスのテンプレートとして考えることもできます。

すべての抽象メソッドをオーバーライドすると、サブクラスは通常のクラスになります。すべてのメソッドがオーバーライドされない場合でも、サブクラスは抽象メソッドのままです。クラスに抽象メソッドが含まれる場合は (たとえ 1 つしかない場合でも)、class キーワードの前に abstract を追加して、クラスを抽象として宣言する必要があります。

抽象メソッドを宣言する構文は、一般メソッドを宣言する構文とは異なります。抽象メソッドは、一般メソッドのように中括弧{}で囲まれた本体を持たず、セミコロン;で終わります。

例6.13では、getAreaメソッドを含むクラスShapeを定義しました。ただし、図形の形状が分からないと面積を求めることができないため、getArea メソッドを抽象メソッドとして宣言しました。 Shape オブジェクトをインスタンス化することはできませんが、例 6.13 のように、継承したり で使用したりすることはできます。

抽象メソッドのみでクラスを作成する場合は、インターフェイスを定義します。この状況を説明するために、PHP にはインターフェースがあり、キーワードが実装されています。抽象クラスの代わりにインターフェイスを使用し、extends の代わりに実装を使用してクラス定義を記述することも、インターフェイスを使用することもできます。これら 2 つのメソッドは個人の好みに応じて選択できます。

/*注:
2 つのメソッドは以下を参照します:
1. 抽象クラス aaa{} (aaa には抽象メソッドのみがあり、一般メソッドはないことに注意してください)
class bbb extends aaa{} (aaa の抽象化を上書きします) bbb メソッド)
2. インターフェース aaa{}
class bbb は aaa{} を実装します (bbb の aaa の抽象メソッドをオーバーライドします)
*/

リスト 6.13 抽象クラス

//abstract root class 抽象根类 
abstract class Shape 
{ 
 abstract function getArea(); //定义一个抽象方法 
}
//abstract child class 抽象子类 
abstract class Polygon extends Shape //多边形 
{ 
 abstract function getNumberOfSides(); 
}
//concrete class 实体类 三角形类 
class Triangle extends Polygon 
{ 
 public $base; 
 public $height;
 public function getArea() //覆写计算面积方法 
 { 
  return(($this->base * $this->height)/2); 
 }
 public function getNumberOfSides() //覆写边数统计方法 
 { 
  return(3); 
 } 
}
//concrete class 实体类四边形 
class Rectangle extends Polygon 
{ 
 public $width; 
 public $height;
 public function getArea() 
 { 
  return($this->width * $this->height); 
 }
 public function getNumberOfSides() 
 { 
  return(4); 
 } 
}
//concrete class 实体类 圆形 
class Circle extends Shape 
{ 
 public $radius;
 public function getArea() 
 { 
  return(pi() * $this->radius * $this->radius); 
 } 
}
//concrete root class 定义一个颜色类 
class Color 
{ 
 public $name; 
}
$myCollection = array(); //建立形状的集合,放入数组
//make a rectangle 
$r = new Rectangle; 
$r->width = 5; 
$r->height = 7; 
$myCollection[] = $r; 
unset($r);
//make a triangle 
$t = new Triangle; 
$t->base = 4; 
$t->height = 5; 
$myCollection[] = $t; 
unset($t);
//make a circle 
$c = new Circle; 
$c->radius = 3; 
$myCollection[] = $c; 
unset($c);
//make a color 
$c = new Color; 
$c->name = "blue"; 
$myCollection[] = $c; 
unset($c);
foreach($myCollection as $s) 
{ 
 if($s instanceof Shape) //如果$s是Shape类的实例 
 { 
  print("Area: " . $s->getArea() . "n"); 
 }
 if($s instanceof Polygon) 
 { 
  print("Sides: " .$s->getNumberOfSides()."n"); 
 }
 if($s instanceof Color) 
 { 
  print("Color: $s->name n"); 
 }
 print("n"); 
}

以上がPHP オブジェクト モデルの抽象メソッドと抽象クラスに関する基本チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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