2012-11-29 4 views
3

저는 도구 상자를 확장하고 더 많은 트릭을 배우려는 초심자 개발자입니다. 나는 최근 Python에서 "decoration"라는 패턴을 발견했으며 기존 PHP 코드베이스를 가지고 있기 때문에 PHP에서 구현할 수 있는지 궁금합니다. 여기 PHP에서 Decorator 구조화

내가 무엇을 의미하는지에 대한 간단한 예입니다 : 그것은 반드시 구문 꽤 그렇게 될 필요가 없습니다

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가 해당 구문을 지원하지 않는다는 것을 알고 있습니다. 하지만 가능한 한 적은 코드로 다시 작성하면서 동일한 효과를 얻을 수 있기를 원합니다.

+2

그 행운하지만, 기본적으로 장식 함수를 반환하는 함수는 당신이 그렇게 할 수 있어야 PHP에서 함수를 반환 할 수 있습니다 그래서 만약 당신이 봐, 나중에 호출 할 수 있습니다 at : http://php.net/manual/fr/function.call-user-func.php. – mpm

답변

1

기본적으로 아니요, PHP에서는 전혀 지원되지 않습니다. 내가 아는 한, 미래의 PHP 버전을위한 로드맵조차도 아니다.

관심의 대상 : 약간의 관련성 : 당신이 phpUnit을 사용하여 코드를 테스트하는 경우 가장 가까운 필자는 PHP 기반에서 생각할 수있는 가장 가까운 곳입니다. phpUnit은 메소드 위의 docblock 유형 주석의 참조를 사용하여이 라인을 따라 뭔가를 구현합니다. 예를 들면 :

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

public function myProviderFunc() { 
    return array(....); 
} 

따라서 phpunit을는 제 myProviderFunc()를 호출 myTestFunc()를 호출하기를 원하고 myTestFunc()로 그 함수의 출력을 통과 할 때.

이렇게하면 나를 가까이에 띄게 만들지 만 설명하는 데코레이터 구문과 거의 같지는 않습니다. 그러나 표준 PHP 구문은 아닙니다. phpUnit은이 모든 것을 스스로 구현합니다. 소스 코드를 읽고 테스트를 실행하기 전에 주석 블록을 구문 분석 할 때 사전 처리로드를 수행하므로 정확하지 않습니다. 단위 테스트 도구에는 적합하지만 프로덕션 시스템에는 적합하지 않습니다.

아니요, 귀하의 질문에 대한 간단한 대답은 원하는 것이 PHP로 수행 될 수 없다는 것입니다. 죄송합니다.