PHP 용 로그 시스템을 구현 중이며 조금 갇혀 있습니다.PHP 5의 메소드 인터셉터 *
모든 구성은 모든 메소드가 기록되도록 선언 한 XML 파일에 정의됩니다. XML은 잘 분석되어 다차원 배열 (classname => array of methods
)로 변환됩니다. 여태까지는 그런대로 잘됐다.
<interceptor>
<methods class="__CLASS_DIR__A.php">
<method name="foo">
<log-level>INFO</log-level>
<log-message>Transaction init</log-message>
</method>
</methods>
<methods class="__CLASS_DIR__B.php">
<method name="far">
<log-level>DEBUG</log-level>
<log-message>Useless</log-message>
</method>
</methods>
</interceptor>
난 단지합니다 (XML하면 런타임에 을하고 싶은 것은 :의 나는이 구성 파일을했습니다 가정 해 봅시다 지금
#A.php
class A {
public function foo($bar) {
echo ' // Hello there !';
}
public function bar($foo) {
echo " $ù$ùmezf$z !";
}
}
#B.php
class B {
public function far($boo) {
echo $boo;
}
}
:
의 간단한 예를 들어 보자 파서가 일을했다) :
#Logger.php (its definitely NOT a final version) -- generated by the XML parser
class Logger {
public function __call($name,$args) {
$log_level = args[0];
$args = array_slice($args,1);
switch($method_name) {
case 'foo':
case 'far':
//case .....
//write in log files
break;
}
//THEN, RELAY THE CALL TO THE INITIAL METHOD
}
}
#"dynamic" A.php
class A extends Logger {
public function foo($log_level, $bar) {
parent::foo($log_level, $bar);
echo ' // Hello there !';
}
public function bar($foo) {
echo " $ù$ùmezf$z !";
}
}
#"dynamic" B.php
class B extends Logger {
public function far($log_level, $boo) {
parent::far($log_level, $bar);
echo $boo;
}
}
큰 도전은 여기에있다. XML 구문 분석기가 작업을 완료하면 A와 B를 "동적"버전으로 변환합니다.
이상적으로는 A와 B의 코드를 수정하지 않고도 (즉, 파일에서) 달성하거나 적어도 프로그램이 끝나면 원래 버전으로 돌아갈 수있는 방법을 찾아야합니다.
분명히하기 위해 PHP에서 메소드 호출을 가로채는 가장 적절한 방법을 찾고 싶습니다.
의견이 있으십니까?
추신 : 물론 클라이언트 코드에는 아무런 결과가 없어야합니다 (가로 채기를 사용하도록 설정했는지 여부는 다를 수 없음).
아직 귀하의 상황을 잘 모르겠습니다. 더 자세한 내용을 추가 할 수 있습니까? 아니면 관련 코드를 보여줄 수 있습니까? 이것은 아마 다른 접근법을 사용하여 수행 되어야만하는 것처럼 들립니다. –
메모 : 편집 됨 (잘하면) 명확한 – Rolf
@Rolf 클래스가 이미 하위 클래스 인 경우에도 문제가 발생합니까? 이 접근법을 사용하면 parent ::를 호출하여 체인을 호출해야합니다. – Chris