2010-12-21 1 views
2

PHP 5.3에서이 정적 '상속'에 약간의 문제가 있습니다. static 클래스에 정적 함수가 있는지 테스트해야하지만 부모 정적 클래스에서 테스트해야합니다.php5.3 정적 상속에 도움이 필요하십니까

필자는 '정적'키워드를 사용하여 'this'키워드를 시뮬레이션 할 수 있습니다. 함수가 있는지 테스트 할 수있는 방법을 찾을 수 없습니다. 나는 그렇지 B::parse(); 아이디어는 서브 클래스가 함수가있는 경우, 그것을 사용하는 것입니다, 가 사용되지 않습니다를 실행해야합니다 그래서 지금

// parent class 
class A{ 

// class B will be extending it and may or may not have 
// static function name 'func' 
// i need to test for it 

    public static function parse(array $a){ 
     if(function_exists(array(static, 'func'){ 
      static::func($a); 
     } 
    } 
} 

class B extends A { 
    public static function func(array $a){ 
     // does something 
    } 
} 

: 여기

은 예입니다.

내가 시도 :

function_exists(static::func){} 
isset(static::func){} 

이 2 작동하지 않습니다.

아이디어가 있습니까? 그건 그렇고, 문제 해결 방법으로 람다 함수를 전달할 가능성을 알고 있습니다. 내 상황에서는 옵션이 아닙니다.

저는 지금 당장 생각할 수없는 매우 간단한 해결책이 있다고 생각합니다.

는 지금은

답변

2

당신은 클래스와 객체 (방법) 만 기능 function_exists을 사용할 수 없습니다를 참조하십시오 호출해야합니다. method_exists 또는 is_callable을 사용해야합니다. isset은 변수에서만 작동합니다. 또한 static$this을 시뮬레이트하지 않으며 완전히 다른 두 가지입니다. 말했다되고 그건

, 특정 경우에, 당신은 인용 static 키워드로 is_callable을 사용할 수 있습니다

if (is_callable(array('static', 'func'))) { 
    static::func(); 
} 

또는 ...

if (is_callable('static::func')) { 
    static::func(); 
} 
+0

is_callable (배열 ('정적', ' func ')) 잘 작동했습니다. 나는 'func'이 존재하지 않는다면 is_callable은 변수가 정의되지 않았다는 경고를 적어도 올릴 수 있다고 생각했지만 그렇지 않았다. func 함수가 존재하지 않으면 false를 반환하는데, 이는 좋은 결과입니다. – Dmitri