gpt4 book ai didi

php - 在 PHP 应用程序中使用装饰器模式

转载 作者:搜寻专家 更新时间:2023-10-31 21:14:51 24 4
gpt4 key购买 nike

在我的应用程序中,我的模型中似乎有很多表示逻辑:

<?php foreach ($this->users as $user): ?>
<span class="phone">
<?php echo $user->getPhoneNumberFormattedAsText(); ?>
</span>
<?php endforeach; ?>

起初,我开始将其视为对 View Helpers 的需求:

<span class="phone"><?php echo $this->userPhone($user->getPhone()); ?></span>

但是,我开始遇到一个问题,我有很多特定于某些模型的小 View 助手,它们不需要占用整个文件。如果我可以将此表示逻辑组合在一起并将其排除在模型之外,那就太好了。我认为这是 decorator pattern 的时候有道理。

"The decorator pattern is a design pattern that allows behaviour to be added to an existing object dynamically."

我在网上看过一些例子,但没有真正的、实用的代码示例。我想知道您是否已在 PHP 应用程序中成功使用此模式,以及此模式的 PHP 示例应该是什么样子。

最佳答案

我已经为我的 php 应用程序实现了装饰器模式。基本上它是一个 xml 配置文件的包装类,我在其中定义我的基本需求。为简化起见,我以披萨为例。然后我为每种成分设置了一个类,并将其包裹在另一个类中。最后我调用了每个类的 prize 方法,它给了我所有的总和。

$order = new pizza($xml_file);
$order = new add_salami($order);
$order = new add_cheese($order);
$order = new add_tomato($order);
$order = $order->prize();

您需要在每个成分类中维护一个指向当前对象的指针。当您调用 php new 函数时,您可以使用它来备份当前对象。它有点像(对象的)链表。然后你可以调用最后一个对象的 prize() 方法并循环遍历所有其他类。但是要装饰你需要添加新的类。您还可以将 $xml_file 替换为起始值。我将所有装饰器类都放在一个文件中。装饰器类可以如下所示:

class add_salami {

protected $order;
protected $prize;

public function __construct ($order) {
$this->order = $order;
$this->prize = $order->getPrize();
}

public function getPrize() {
return $this->prize + 10;
}
}

我在一个巨大的文件中保存了许多这些微小的装饰器类。

关于php - 在 PHP 应用程序中使用装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11232888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com