是否有可能(以某种方式?)在PHP接口中声明构造函数的格式(或任何关于它的内容)


Is it possible to (somehow?) declare the format of a constructor in a PHP interface (or anything about it)?

我想要一些关于我的编码方法的反馈(即,它是否合适,或者我所做的是否可以用更好的方式完成):

我想创建一个接口来记录构造函数应该具有特定格式。当然,如果接口只包含一个构造函数(PHP让你在接口中放入一个构造函数,我甚至感到惊讶),那么接口将没有任何效果(除了可能的文档)。此外,PHP不强制任何可调用的参数进行匹配,无论是在数量上还是在类型上,函数、方法和构造函数都是如此。

如果你看到我是如何命名我的类的,你就会意识到我正在尝试做什么(:说明构造函数参数必须是一个messager实例,很遗憾我不能做更多的事情来强制执行这一点)。请让我知道我的方法是否可以,以及我是否可以改进它。

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!

也许这是不可能的,但可以使用一种(或多种)工厂方法来解决问题:

保持不变:

class Messenger {
  private $message;
  function __construct($message = "Hello!") {
    $this->message = $message;
  }
  public function getMessage() {
    return $this->message;
  }
}

此修改。。。

interface MessengerAware {
  public static function create($messenger);
  public function displayMessengerMessage();
}

而这个。。。

class MessengerKnower implements MessengerAware {
  private $messenger;
  public static function create($messenger) {
    $messengerKnower = new MessengerKnower();
    $messengerKnower->messenger = $messenger;
    return $messengerKnower;
  }
  public function displayMessengerMessage() {
    echo $this->messenger->getMessage();
  }
}

保持不变。。。

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 = MessengerKnower::create(new Messenger());
$runner = new Runner($messengerAware);
$runner->run();

输出:

I'm running.
Hello!