2009-08-14 3 views
-1

클래스 정의시 투명하게 코드를 실행하는 방법을 찾고 있습니다. 더 중요한 것은 클래스가 확장 될 때입니다. 예를 들어클래스 정의시 코드를 실행하는 방법 (객체 인스턴스화가 아님)

, 내가있는 경우 :

class A 
{ function define() 
    { echo "A has been defined!\n"; 
    } 
    __magicDefine 
    { define(); 
    } 
} 

class B extends A 
{ 
} 

내가 그! "A는 정의 된 \ n"인쇄하고 싶습니다. 불가능한가요?

답변

2

그건 불가능합니다. 예. 클래스 정의에서 아무 것도 호출되지 않습니다.

이 개념은 적극적으로 지원되지 않는 유형입니다. 쓰기를 시도하십시오

그리고 당신은 Fatal error: Constructor blah::__construct() cannot be static을 얻을거야.

2

내가하려는 것은 실행중인 개체를 추적하는 것입니다. 최종 목표가 무엇인지 정확히 알지 못합니다.

아마도 당신은 런타임에 ReflectionClass를 찾고 있습니까? 클래스가 있는지와 확장 클래스가 무엇인지 확인할 수 있습니다.

당신이 목표로하는 것은 사용중인 객체를 추적하는 객체 팩토리입니다. 싱글 톤, 팩토리 및 정적 멤버 함수/변수 개념을 살펴 봅니다. 이에 관해서는

은 : 클래스 B가 생성자를 오버라이드 (override)

class A 
{ 
public function __construct() 
{ print "A has been called"; 
} 
} 

경우, A의 생성자를 호출 않을거야. 그 많은 도움이된다면

function doSomethingWithA(A $a).... 

function doSmoethingWithA($a) 
{ 
if($a instanceof A) 
{ 
    // blah 
} 
} 

이 몰라 : 예는 : B는 여러 가지 방법의 하나의 인스턴스 인 경우

class B extends A 
{ 
public function __construct() 
{ print "B has been called"; 
    // parent::__construct(); /// would print out A has been called 
} 
} 

그러나 코드에서 확인할 수 있습니다.

+0

내가 그 트랙에 없다면 실제로 도움이 될 것입니다. 감사! 나는 내가 원하는 것을하는 다른 방법을 모색 중입니다. 나는 Sqool이라는 데이터베이스 추상화 레이어를 만들고 있는데, 사용자가 단일 클래스를 만들어서 사용할 수 있다는 점에서 정말 좋습니다. 문제는 누군가가 적어도 하나의 객체를 이미 인스턴스화 한 경우에만 기본 "sqool 클래스"(테이블)가 존재한다는 것을 알고 있다는 것입니다. 이 문제를 해결하기 위해 계획하고있는 방법은 사용자가 아직 클래스를 알지 못하는 경우 호출 할 수있는 함수 (표준 이름)를 만드는 것입니다. 관심이 있으시면 http://tinyurl.com/o3tz2n을 확인하십시오. –

0

Java에서이 은 가능하면 java.lang.instrument.ClassFileTransformer을 JVM에 등록하는 "Java 에이전트"를 사용하여입니다.

관련 문제