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

时间:2015-02-17 03:42:52

标签: php interface constructor typechecking model-checking

我想对我的编码方法提出一些反馈意见(即,它是否合适,或者我所做的事情是否可以以更好的方式完成):

我想创建一个接口来记录构造函数应该具有特定格式。当然,如果接口只包含一个构造函数(我甚至惊讶于PHP允许你在接口中放置一个构造函数),那么该接口将没有任何效果(除了可能的文档)。此外,PHP不强制任何callable的参数匹配,无论是数字还是类型,这对于函数,方法和构造函数都是如此。

如果您看到我如何命名我的类,您将意识到我正在尝试做什么(:文档说构造函数参数必须是一个消息传递器实例,太糟糕了,我无法做更多来强制执行此操作)。如果我的方法合适,我是否可以改进,请告诉我。

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!

1 个答案:

答案 0 :(得分:0)

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

保持不变:

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!