如何在没有父属性的情况下获取子属性?

时间:2013-03-03 03:33:25

标签: php

我有类似以下内容:

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和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();

1 个答案:

答案 0 :(得分: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