在__contruct()中使用get_class_vars()的意外继承行为

时间:2015-06-05 09:58:01

标签: php oop

我遇到了继承问题。以下是代码:

namespace{
    $resume=new resume('\\resume');
    class resume{
        function __construct($className){
            $children=get_class_vars($className);
            foreach($children as$name=>$var){
                $fqcn=$className."\\$name";
                $this->{$name}=new $fqcn($fqcn);
            }
        }
        private$evan;
        private$education;
        private$employment;
        private$expertise;
        private$portfolio;
    }
}
namespace resume{
    class evan extends \resume{
        private$information;
        private$permAddress;
        private$businessAddress;
    }
}

当我转储get_class_vars()的结果时,我得到以下内容:

array(5) {
   ["evan"]=>
  NULL
  ["education"]=>
  NULL
  ["employment"]=>
  NULL
  ["expertise"]=>
  NULL
  ["portfolio"]=>
  NULL
}
array(5) {
  ["evan"]=>
  NULL
  ["education"]=>
  NULL
  ["employment"]=>
  NULL
  ["expertise"]=>
  NULL
  ["portfolio"]=>
  NULL
}

我的预期结果是:

array(5) {
   ["evan"]=>
  NULL
  ["education"]=>
  NULL
  ["employment"]=>
  NULL
  ["expertise"]=>
  NULL
  ["portfolio"]=>
  NULL
}
array(5) {
  ["information"]=>
  NULL
  ["permAddress"]=>
  NULL
  ["businessAddress"]=>
  NULL
}

倾倒$className给了我:

\resume
\resume\evan

然后在尝试访问\resume\evan\evan时中断。显然,传递给get_class_vars()的论证是正确的,但输出在儿童中保持不变......

1 个答案:

答案 0 :(得分:1)

这是一个较短的测试用例:

class A {
    private $aa;

    function fun($cls) {
        print_r(get_class_vars($cls));
    }
}

class B extends A{
    private $bb;
}

$a = new A;
$a->fun('A');
$a->fun('B');

结果:

Array
(
    [aa] => 
)
Array
(
    [aa] => 
)

问题是,当您从get_class_vars调用A时,它无权访问B的私有,因此只显示自己的私有。如果您将private替换为protected,则会同时显示aabb。我不知道如何获得类的自己的属性,但这很容易按array_diff(derived-class-props, base-class-props)的方式实现。