是否可以(以某种方式?)在 PHP 接口(或任何相关接口)中声明构造函数的格式?
Is it possible to (somehow?) declare the format of a constructor in a PHP interface (or anything about it)?
我想要一些关于我的编码方法的反馈(即,它是否合适,或者我所做的是否可以用更好的方式完成):
我想创建一个接口来记录构造函数应具有特定格式。当然,如果接口只包含一个构造函数(我什至对 PHP 允许您在接口中放置一个构造函数感到惊讶),该接口将没有任何效果(除了可能的文档)。此外,PHP 不强制任何可调用参数匹配,无论是数量还是类型,函数、方法和构造函数都是如此。
如果你看到我如何命名我的 classes,你就会明白我正在尝试做什么(:构造函数参数必须是一个 messager 实例的文档,太糟糕了我不能做更多强制执行)。请让我知道我的方法是否可以,以及我是否可以改进它。
class Messenger {
private $message;
function __construct($message = "Hello!") {
$this->message = $message;
}
public function getMessage() {
return $this->message;
}
}
考虑到上面的简单 class,我想创建一个如下所示的接口,但是由于我们正在处理 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 中执行我的接口,如下所示:
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!
我想要一些关于我的编码方法的反馈(即,它是否合适,或者我所做的是否可以用更好的方式完成):
我想创建一个接口来记录构造函数应具有特定格式。当然,如果接口只包含一个构造函数(我什至对 PHP 允许您在接口中放置一个构造函数感到惊讶),该接口将没有任何效果(除了可能的文档)。此外,PHP 不强制任何可调用参数匹配,无论是数量还是类型,函数、方法和构造函数都是如此。
如果你看到我如何命名我的 classes,你就会明白我正在尝试做什么(:构造函数参数必须是一个 messager 实例的文档,太糟糕了我不能做更多强制执行)。请让我知道我的方法是否可以,以及我是否可以改进它。
class Messenger {
private $message;
function __construct($message = "Hello!") {
$this->message = $message;
}
public function getMessage() {
return $this->message;
}
}
考虑到上面的简单 class,我想创建一个如下所示的接口,但是由于我们正在处理 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 中执行我的接口,如下所示:
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!