在 PHP 中构造装饰器
Posted
技术标签:
【中文标题】在 PHP 中构造装饰器【英文标题】:Structuring Decorators in PHP 【发布时间】:2012-11-17 19:10:07 【问题描述】:我是一个新手开发人员,试图扩展我的工具箱并学习更多技巧。我最近在 Python 中遇到了一种称为“装饰”的模式,我想知道是否/如何在 php 中实现它,因为我有一个现有的 PHP 代码库。
这是我的意思的一个简短示例:
import time
def log_calls(func):
def wrapper(*args, **kwargs):
now = time.time()
print("Calling 0 with 1 and 2".format(
func.__name__,
args,
kwargs
))
return_value = func(*args, **kwargs)
print("Executed 0 in 1ms".format(
func.__name__,
time.time() - now
))
return return_value
return wrapper
@log_calls
def test1(a,b,c):
print("\ttest1 called")
@log_calls
def test2(a,b):
print("\ttest2 called")
@log_calls
def test3(a,b):
print("\ttest3 called")
time.sleep(1)
test1(1,2,3)
test2(4,b=5)
test3(6,7)
不一定要在语法上那么漂亮;我了解所有语言都有其细微差别,并且我知道 PHP 不支持该语法。但是我还是希望能够在尽可能少的重写代码的同时达到同样的效果。
【问题讨论】:
祝你好运,但基本上装饰器是返回函数的函数,你可以稍后调用,所以如果你可以在 php 中返回一个函数,你应该能够做到这一点,看看:@987654321 @也是。 【参考方案1】:基本上不,PHP 根本不支持它。据我所知,它甚至不在未来 PHP 版本的路线图上。
有趣,并且稍微相关:在 PHP 领域,我能想到的最接近您所追求的是如果您使用 phpUnit 来测试您的代码。 phpUnit 通过在方法上方的 docblock 类型 cmets 中使用引用实现了一些类似的东西以供自己使用。例如:
/**
* @dataProvider myProviderFunc
*/
public function myTestFunc($argsFromProvider)
....
public function myProviderFunc()
return array(....);
因此,当 phpUnit 想要调用myTestFunc()
时,它首先调用myProviderFunc()
,并将该函数的输出传递给myTestFunc()
。
这让我觉得与您描述的装饰器语法很接近,但并不完全相同。但是,它不是标准的 PHP 语法; phpUnit 自己实现了所有这些东西。它读取源代码并在运行测试之前解析注释块时进行大量预处理,因此效率不高。适用于单元测试工具,但不适用于生产系统。
但是不,对您的问题的简短回答是,您想要的内容无法在 PHP 中完成。对不起。
【讨论】:
【参考方案2】:PHP 没有对装饰器模式的语法支持,但没有什么能真正阻碍您自己实现它。
您可以查看以下可能与您的问题相关的讨论:
how to implement a decorator in PHP? Trying to implement (understand) the Decorator pattern in php这是另一个资源,包含多种语言的 UML 图和代码示例,包括 PHP。
Decorator Design Pattern【讨论】:
以上是关于在 PHP 中构造装饰器的主要内容,如果未能解决你的问题,请参考以下文章