1

私のコーディング アプローチに関するフィードバックをお願いします (つまり、それが適切かどうか、または私が行ったことをより良い方法で行うことができるかどうか)。

コンストラクターが特定の形式を持つ必要があることを文書化するためのインターフェイスを作成したいと思います。もちろん、インターフェイスにコンストラクターしか含まれていない場合 (PHP でコンストラクターをインターフェイスに配置できることに驚きました)、インターフェイスは何の効果もありません (おそらくドキュメントを除いて)。その上、PHP は、呼び出し可能オブジェクトのパラメーターの一致を、数でも型でも強制しません。これは、関数、メソッド、およびコンストラクターにも当てはまります。

私がクラスにどのように名前を付けたかがわかれば、私が何をしようとしているのかがわかるでしょう (: コンストラクターのパラメーターはメッセージのインスタンスでなければならないことを文書化してください。私のアプローチが正しいかどうか、また改善できるかどうか教えてください。

class Messenger {

  private $message;

  function __construct($message = "Hello!") {

    $this->message = $message;

  }

  public function getMessage() {

    return $this->message;

  }

}

上記の単純なクラスを念頭に置いて、次のようなインターフェイスを作成したいのですが、PHP コンストラクターを扱っているので、これは役に立たないはずですか?

interface MessengerAware {

  function __construct($messenger);

}

class MessengerKnower implements MessengerAware {

  private $messenger;

  function __construct($messenger) {

    $this->messenger = $messenger;

  }

  public function displayMessengerMessage() {

    echo $this->messenger->getMessage();

  }

}

Runner次に、次のようなクラスでインターフェイスを強制したいと考えています。

class Runner {

  private $messengerAware;

  function __construct($messengerAware) {

    if (!is_a($messengerAware, 'MessengerAware')) {

      die("I'm expecting an instance implementing the MessengerAware interface.");

    }

    $this->messengerAware = $messengerAware;

  }

  public function run() {

    echo "I'm running.\n";

    $this->messengerAware->displayMessengerMessage();

  }

}

最後に次のコードを実行します。

$messengerAware = new MessengerKnower(new Messenger());
$runner = new Runner($messengerAware);
$runner->run();

出力:

I'm running.
Hello!
4

1 に答える 1