2012-11-12 2 views
2

Existe-t-il un moyen de savoir si la valeur de la propriété de classe provient du parent ou de la sous-classe.PHP: est la propriété de classe/valeur constante de la classe secondaire ou secondaire

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"; 

Même question à propos des constantes de classe.

Est-il possible de connaître la classe exacte où la constante est déclarée (accédant à la sous-classe C)? Fonction définie ("C :: SomeConstant"); renvoie vrai si SomeConstant est déclaré dans A ou B ou C. Je cherche une solution pour savoir si la constante est déclarée dans la classe C pas dans les parents.

+1

Vous aurez probablement besoin d'utiliser la réflexion pour accomplir ceci. Mais il semble que la conception est mauvaise si vous devez le faire dans une application réelle. – FtDRbwLXw6

Répondre

0

Cela devrait résoudre une partie de votre question. La condition pour que ce code fonctionne correctement est dans la sous-classe, la variable redefine doit avoir la valeur par défaut différente de la classe parente.

/** 
* @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"; 
Questions connexes