是否可以(不知何故)在PHP接口中声明构造函数的格式(或任何相关内容)?

是否可以(不知何故)在PHP接口中声明构造函数的格式(或任何相关内容)?,php,interface,constructor,typechecking,model-checking,Php,Interface,Constructor,Typechecking,Model Checking,我希望得到一些关于我的编码方法的反馈,例如,它是否合适,或者我所做的是否可以以更好的方式完成: 我想创建一个接口来记录构造函数应该具有特定格式的文档。当然,如果接口只包含一个构造函数,我甚至对PHP允许您在接口中放置构造函数感到惊讶,那么除了可能的文档之外,接口将没有任何效果。此外,PHP不强制任何可调用的参数进行匹配,无论是在数量上还是在类型上,函数、方法和构造函数都是如此 如果您看到我如何命名我的类,您就会意识到我正在尝试做的事情:记录构造函数参数必须是messager实例,太糟糕了,我无法

我希望得到一些关于我的编码方法的反馈,例如,它是否合适,或者我所做的是否可以以更好的方式完成:

我想创建一个接口来记录构造函数应该具有特定格式的文档。当然,如果接口只包含一个构造函数,我甚至对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();
$messengerAware = MessengerKnower::create(new Messenger());
$runner = new Runner($messengerAware);
$runner->run();
输出:

I'm running.
Hello!
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 = new MessengerKnower(new Messenger());
$runner = new Runner($messengerAware);
$runner->run();
$messengerAware = MessengerKnower::create(new Messenger());
$runner = new Runner($messengerAware);
$runner->run();
输出:

I'm running.
Hello!
I'm running.
Hello!