1

私は次のようなものを持っています:

class a {

    private $firstVar;  

    function foo(){

        print_r( get_class_vars( 'b' ) );   
    }
}


class b extends a{

    public $secondVar;  

}

a::foo();
print_r( get_class_vars( 'b' ) );

出力は

Array ( [secondVar] => [firstVar] => ) 
Array ( [secondVar] => )

これは、get_class_vars('b') が呼び出されたときに firstVar にアクセスできるためだと思いますが、関数 foo() を取得して、親変数なしでクラス 'b' 変数のみを出力するにはどうすればよいでしょうか?

http://php.net/manual/en/function.get-class-vars.phpには、a 変数を取得し、次にすべての a 変数と b 変数を取得してから、両方にある変数を削除して残すという解決策があります。 b 変数だけです。しかし、この方法は面倒に思えます。別の方法はありますか?


現在使用している回避策:

class a {

    private $firstVar;  

    function foo(){

        $childVariables = array();

        $parentVariables = array_keys( get_class_vars( 'a' ));

        //array of 'a' and 'b' vars
        $allVariables = array_keys( get_class_vars( get_class( $this ) ) );

        //compare the two
        foreach( $allVariables as  $index => $variable ){

            if( !(in_array($variable, $parentVariables))){

                //Adding as keys so as to match syntax of get_class_vars()
                $childVariables[$variable] = "";
            }
        }

        print_r( $childVariables );
    }
}


class b extends a{

    public $secondVar;  

}

$b = new b;
$b->foo();
4

1 に答える 1

2

より低いバージョンの PHP で実行している必要があります。同じコードのコードパッドで問題なく動作します。

デモ: http://codepad.org/C1NjCvfa

ただし、代替手段を提供します。リフレクション クラスを使用します。

public function foo()
{
  $refclass = new ReflectionClass(new b());
  foreach ($refclass->getProperties() as $property)
  {
    echo $property->name;
    //Access the property of B like this
  }
}

Preview

于 2013-03-03T05:00:58.887 に答える