抽象クラスは直接インスタンス化できません。抽象クラスは、サブクラスに必要なメソッドを定義 (または部分的に実装) するだけです。サブクラスは、その抽象クラスを 継承して、その抽象メソッドを実装することで抽象クラスを具体化できます。 abstract キーワードを使用して抽象クラスを定義できます。ほとんどの場合、抽象クラスには少なくとも 1 つの抽象メソッドが含まれます。抽象メソッドは、abstract キーワードを使用して宣言され、特定のコンテンツを持つことはできません。
abstract class ShopProductWriter{ protected $products = array(); public function addProduct(ShopProduct $shopProduct) { $this->products[] = $shopProduct; } abstract public function write();}
抽象メソッドを作成した後、そのメソッドがすべてのサブクラスに実装されていることを確認しますが、最初に実装の詳細を決定することはできません。各サブクラスは、抽象クラス内のすべての抽象メソッドを実装するか、それ自体を抽象メソッドとして宣言する必要があります。拡張クラスは、抽象クラスのメソッドを単に実装するだけでなく、メソッドを再宣言する必要があります。新しい実装メソッドの アクセス制御 は、抽象メソッドのアクセス制御よりも厳密にすることはできません。新しい実装メソッドのパラメータの数は、抽象メソッドのパラメータの数と同じである必要があり、対応する型ヒントが再生成される必要があります。
class XmlProductWriter extends ShopProductWriter{ public function write() { $str='<?xml version="1.0" encoding="UTF-8"?>'."\n"; $str.="<products>\n"; foreach ($this->products as $shopProduct) { $str.="\t<product title=\"{$shopProduct->getTitle()}\">\n"; $str.="\t\t<summary>\n"; $str.="\t\t{$shopProduct->getSummaryLine()}\n"; $str.="\t\t</summary>\n"; $str.="\t</product>\n"; } $str.="</products>\n"; print $str; } }class TextProductWriter extends ShopProductWriter{ public function write() { $str="PRODUCTS:\n"; foreach ($this->products as $shopProduct) { $str.=$shopProduct->getSummaryLine()."\n"; } print $str; } }
抽象クラスは特定の実装標準を提供しますが、インターフェイスは純粋なテンプレートです。インターフェイスでは関数のみを定義でき、実装コンテンツは定義できません。インターフェイスは、キーワードinterfaceを使用して宣言できます。インターフェイスにはプロパティとメソッド宣言を含めることができますが、メソッド本体は空です。
interface Chargeable{ public function getPrice();}
インターフェイスを実装するクラスは、インターフェイスに定義されているすべてのメソッドを実装する必要があります。それ以外の場合、クラスは抽象として宣言する必要があります。クラスは、その宣言でimplementキーワードを使用してインターフェースを実装できます。
class ShopProduct implements Chargeable { //... function getPrice() { return ($this->getPrice-$this->discount); } //...}
ShopProduct クラスにはすでに getPrice() メソッドがありますが、Chargeable インターフェイスを実装することはまだ有用ですか?答えは「はい」です。タイプがあるからです。インターフェイスを実装するクラスは、継承するクラスの型と実装するインターフェイスを受け入れます。
どのクラスでもインターフェイスを実装でき、インターフェイスは無関係な型を効果的に接続できます。クラスは親クラスを継承し、同時に任意の数のインターフェイスを実装できます。 extends 句は、implements 句の前に置きます。
class Consultancy extends TimedService implements Bookable, Chargeable{//...}
この機能の最も明らかな兆候は、新しいキーワード static です。 static は self に似ていますが、それを含むクラスではなく、呼び出されるクラスを参照します。この場合、Document::create() を呼び出すと、DomainObject オブジェクトをインスタンス化する代わりに、新しい Document オブジェクト が生成されることを意味します。
abstract class DomainObject{ public static function create() { return new static(); } }class User extends DomainObject{ }class Document extends DomainObject{} print_r(Document::create());//输出为Document Object// (// )
static キーワードはインスタンス化以外にも使用できます。 self やparent と同様に、static は、非静的コンテキストからであっても、静的メソッド呼び出しの識別子として使用できます。
りー以上がPHP のオブジェクト指向、パターンと実践の高度な機能についての深い理解 (2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。