Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的结构化装饰器_Php_Python_Decorator - Fatal编程技术网

PHP中的结构化装饰器

PHP中的结构化装饰器,php,python,decorator,Php,Python,Decorator,我是一个新手开发人员,试图扩展我的工具箱,学习更多的技巧。我最近在Python中遇到了一个名为“装饰”的模式,我想知道我是否/如何在PHP中实现它,因为我有一个现有的PHP代码库 下面是一个简短的例子,说明我的意思: import time def log_calls(func): def wrapper(*args, **kwargs): now = time.time() print("Calling {0} with {1} and {2}".fo

我是一个新手开发人员,试图扩展我的工具箱,学习更多的技巧。我最近在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 {1}ms".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根本不支持它。据我所知,它甚至不在未来PHP版本的路线图上

有趣的是,也有点相关:在PHP领域,我能想到的最接近您所追求的是使用phpUnit测试代码。phpUnit使用方法上方的docblock类型注释中的引用,按照这些思路实现一些东西供自己使用。例如:

/**
 * @dataProvider myProviderFunc
 */
public function myTestFunc($argsFromProvider) {
    ....
}

public function myProviderFunc() {
    return array(....);
}
因此,当phpUnit想要调用
myTestFunc()
时,它首先调用
myProviderFunc()
,并将该函数的输出传递到
myTestFunc()

这让我觉得很接近,但与您描述的decorator语法不太一样。然而,它不是标准的PHP语法;phpUnit自己实现所有这些东西。它读取源代码,并在运行测试之前解析注释块时对其进行预处理,因此效率不高。适用于单元测试工具,但不适用于生产系统


但是不,您的问题的简短答案是,您想要的东西不能在PHP中完成。抱歉。

PHP对decorator模式没有语法支持,但没有什么真正妨碍您自己实现它

您可以研究以下可能与您的问题相关的讨论:

这里是另一个资源,有多种语言的UML图和代码示例,包括PHP


祝您好运,但基本上装饰器是返回函数的函数,您可以稍后调用这些函数,因此,如果您可以在php中返回函数,您应该能够做到这一点,请看:太。