オブジェクト向けのいくつかの概念

3211 ワード

インタフェース向けプログラミング
インタフェースは、現実の「物」が利用可能になるためには、これらの基本的な機能を実現しなければならないという仕様を定義します.
インタフェース自体は実装を提供していませんが、仕様を提供しています.クラスがインタフェースを実装していることを知っていれば、インタフェースを呼び出す方法がわかります.これらを知るだけで十分です.
PHPは弱いタイプであり、柔軟性を強調するため、大規模なインタフェースの使用を推奨するのではなく、一部の「カーネル」コードでのみインタフェースを使用します.PHPのインタフェースは多くのインタフェースが持つべき意味を失っているからです.意味的には抽象クラスをより多く使用することができる.抽象クラスとインタフェースの比較については,後述しない.
インタフェースは規範と契約として存在する.規範として、インタフェースは可用性を保証しなければならない.契約として、インタフェースは制御性を保証しなければならない.PHPのインタフェースには2つの不足があり、1つは契約の制限がなく、2つは十分な内部インタフェースが欠けている.
1つのサブクラスimplementsが1つのインタフェースであれば、インタフェース内のすべての方法(必要かどうかにかかわらず)を実装する必要があります.抽象クラスを継承する場合は、必要なメソッドを実装するだけで、1つのインタフェースで定義されたメソッド名が変更された場合、このインタフェースを実装するすべてのサブクラスは、メソッド名を同期的に更新する必要があります.抽象クラスでメソッド名が変更された場合、そのサブクラスに対応するメソッド名は影響を受けず、新しいメソッドになっただけです.抽象クラスは単一でしか継承できません.1つのサブクラスが実現する必要がある機能が複数の親クラスを継承する必要がある場合は、インタフェースを使用する必要があります.
interface Demo
{
  public function func1();
  public function func2();
}

interface Demo2 extends Demo
{
  public function func3();
  public function func4();
} 

interface Demo3 
{
  public function func5();
  public function func6();
}

class ParentClass
{
  public function func7(){}
}


class ChildClass extends ParentClass implements Demo2, Demo3
{
  public function func1(){}
  public function func2(){}
  public function func3(){}
  public function func4(){}
  public function func5(){}
  public function func6(){}
}

はんしゃ
オブジェクト向けプログラミングではオブジェクトに自省能力が与えられ,この自省の過程は反射である.反射、直観的な理解は到着地に基づいて出発地と源を見つけることである.
$ref = new ReflectionClass($classname) $ref->getProperties(); $ref->getMethods(); $ref->isInstantiable(); $res->newInstanceArgs();
通常の開発では、反射に使用される場所は多くありません.1つはオブジェクトをデバッグし、もう1つはクラスの情報を取得します.MVCやプラグイン開発では,反射を用いることが一般的であるが,反射の消費も大きく,代替案が見つかる場合は乱用しない.
多くの場合、反射はコードの優雅さと簡潔さを保つことができるが、反射はクラスのパッケージ性を破壊する.反射は本来暴露すべきではない方法や属性を強制的に暴露することができるため、これは利点であり欠点でもある.
';
  }
  
  public function drink()
  {
    echo 'drink 
'; } public function ok() { echo 'ok
'; } } // interface Command { public function execute(); } // class MealCommand implements Command { public $cook; public function __construct($cook){ $this->cook = $cook; } public function execute() { $this->cook->meal(); } } // class DrinkCommand implements Command { public $cook; public function __construct($cook) { $this->cook = $cook; } public function execute() { $this->cook->drink(); } } // class cookController { public $mealCommand; public $drinkCommand; public function __construct(MealCommand $mealCommand, DrinkCommand $drinkCommand) { $this->mealCommand = $mealCommand; $this->drinkCommand = $drinkCommand; } public function callMeal() { $this->mealCommand->execute(); } public function callDrink() { $this->drinkCommand->execute(); } } $cook = new Cook(); $mealCommand = new MealCommand($cook); $drinkCommand = new DrinkCommand($cook); $c = new cookController($mealCommand, $drinkCommand); $c->callMeal(); $c->callDrink();