我遇到了继承问题。以下是代码:
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()
的论证是正确的,但输出在儿童中保持不变......
答案 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
,则会同时显示aa
和bb
。我不知道如何获得类的自己的属性,但这很容易按array_diff(derived-class-props, base-class-props)
的方式实现。