2017-12-05 32 views
5

Go! Aspect-Oriented Framework for PHPPECL-extentions가 필요없는 일반 PHP의 AOP (Go!) - 어떻게?

이라는 프레임 워크가 있습니다. 일반 PHP로 만들어 졌으므로 PECL 확장 및 DI 컨테이너가 필요하지 않습니다.

기존의 PHP 프레임 워크 및 라이브러리 (추가 구성 유무에 관계없이)와 통합 할 수있는 것은 무엇입니까?

포인트 컷의 런타임 검사, 런타임 주석 분석,에 콜 없음 및 __call 메소드, 느린 프록시 및 call_user_func_array()가 없습니다. 빠른 부트 스트래핑 프로세스 (2 ~ 20ms) 및 조언 호출.

저는 매우 감명 받았지만, 제가 알고 싶은 것은, 그것이 실제로 어떻게 작동할까요? 내가 여기에 나열된

이 점은 ...

나는 GitHub의 공식 웹 사이트, 그리고 몇몇 다른 기사에보고하지만,이 작업을 수행하는 방법에 대한 (일반적으로 특정의) 어떤 구체적인 정보를 찾을 수 없습니다.

나는 이것이 어떻게 작동하는지 알고 싶어합니다. 어떻게 구현 되었습니까?

답변

6

이 프레임 워크의 작업을 수행하기 위해 많은 숨겨진 트릭을 사용하지만, 우리는 새의 관점에서 보면, 다음 과정은 다음과 같이 설명 될 수 있습니다 : AOP 엔진의 현재 버전은 설계

  1. 과 함께 긴밀하게 작업 composer이므로 자신의 프록시로 작성자 로더를 래핑합니다. 그 시점부터 AOP는 어떤 클래스가로드되어야하는지, 소스 코드를 찾을 곳을 알고있다.
  2. Foo 클래스가 Foo.php 파일에서로드 될 때 AOP는 다음과 같이 특수 필터 스트림에 래핑합니다. include 'php://filter/read=go.source.transforming.loader/resource=Foo.php';. 이 스트림 필터에 대한 자세한 내용은 'php://stream' manual
  3. 에서 읽을 수 있습니다. 그 시점에서 클래스는 PHP 메모리에로드되지 않지만 프레임 워크는 이미 내용을 알고 있으며 소스 코드를 분석하거나 심지어 수정할 수 있습니다. 그 후, 토큰 화
  4. 소스 코드 nikic/PHP-Parser 라이브러리 통해 AST에 해석이 코드 다음 정적 반사 측면에서 goaop/parser-reflection
  5. 엔진 검사 등록 된 모든 포인트 컷 비아 (여전히 PHP의 메모리에이 파일을로드하지 않고) 생성되고, 일본어의 변환을 수행한다 Foo : 파일 이름이 Foo__AopProxied으로 바뀌고 Foo extends Foo__AopProxied 클래스의 새 파일이 캐시에 생성됩니다.
  6. 엔진을 사용하여 원본 파일 대신이 새 파일에서이 클래스를로드하면 원래 클래스 이름이되지만 조언의 추가 논리가 생깁니다. 런타임시 자동 데코레이터 생성과 같습니다.

물론 순수 PHP에서 AOP를 구현하는 것이 매우 힘들었고 작업 솔루션을 발견하기 전에 여러 번 시도했기 때문에 소스 코드를 파헤 치면 흥미로울 수 있습니다 숨겨진 보석 :) 일부 정보는 내 PhpSerbia talk about cross-cutting concerns in PHP에서도 볼 수 있습니다. 더 잘 이해하기 위해 볼 수 있습니다 (영어로 유감입니다).

또한 프레임 워크에 대한 문서 작업 중입니다. 더 잘 만들고 싶다면 official documentation으로 홍보를 보내주십시오.

PHP 프로젝트에서 AOP를 사용하는 개발자에게 많은 기능을 제공하는 PhpStorm 플러그인을 사용해야합니다.