2

クラスプロパティ値が親からのものかサブクラスからのものかを確認する方法はありますか?

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にアクセスする)正確なクラスを見つけることは可能ですか?関数defined( "C :: SomeConstant"); SomeConstantがA、B、またはCで宣言されている場合、trueを返します。定数が親ではなくクラスCで宣言されているかどうかを確認するための解決策を探しています。

4

1 に答える 1

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";
于 2012-11-12T03:06:31.680 に答える