2012-11-12 4 views
2

클래스 속성 값이 부모 클래스 또는 하위 클래스의 값인지 여부를 확인하는 방법이 있습니까?PHP : 하위 또는 상위 클래스의 클래스 속성/상수 값

class A { 
    public static $property1 = "X"; 
    public static $property2 = "Y"; 

    public static isFrom($propertyName) { 
     /// what should be here? 
    } 
} 

class B extends A { 
    public static $property1 = "Z"; 
} 

class C extends B { 
} 

C::isFrom("property1"); /// should return "CLASS B"; 
C::isFrom("property2"); /// should return "CLASS A"; 

클래스 상수에 대해 같은 질문이 있습니다.

상수가 선언 된 정확한 클래스를 찾을 수 있습니까 (서브 클래스 C에 액세스합니까?)? 정의 된 함수 ("C :: SomeConstant"); SomeConstant가 A 또는 B 또는 C로 선언되면 true를 반환합니다. 상수가 클래스 C에서 부모가 아니라고 선언되는지 여부를 알아내는 해결책을 찾고 있습니다.

+1

아마도 이것을 수행하기 위해 리플렉션을 사용해야 할 것입니다. 그러나 실제 응용 프로그램에서이 작업을 수행해야하는 경우 디자인이 좋지 않은 것처럼 보입니다. – FtDRbwLXw6

답변

0

이렇게하면 질문의 일부가 해결됩니다. 이 코드가 잘 작동하는 조건은 하위 클래스에 있으며 재정의 변수는 부모 클래스와 다른 기본값을 가져야합니다.

/** 
* @author Bang Dao 
* @copyright 2012 
*/ 

class A { 
    public static $property1 = "X"; 
    public static $property2 = "Y"; 

    public static function isFrom($propertyName) { 
     $class = get_called_class(); 
     $vars = array(); 
     do{ 
      $_vars = get_class_vars($class); 
      $vars[$class] = $_vars; //for other used 
      $class = get_parent_class($class); 
     } while($class); 

     $vars = array_reverse($vars); 
     $class = -1; 
     foreach($vars as $k => $_vars){ 
      if(isset($_vars[$propertyName])){ 
       if($class == -1) 
        $class = $k; 
       else{ 
        if($_vars[$propertyName] !== $vars[$class][$propertyName]) 
         $class = $k; 
       } 
      } 
     } 

     return $class; 
    } 
} 

class B extends A { 
    public static $property1 = "Z"; 
} 

class C extends B { 
} 

echo C::isFrom("property1"); /// should return "CLASS B"; 
echo '<br />'; 
echo C::isFrom("property2"); /// should return "CLASS A"; 
관련 문제