class Parent1 {
//private $a;
//private $b;
function foo(){
foreach(get_object_vars($this) as $name => $value){
echo "$name holds $value";
}
}
}
class Child1 extends Parent1 {
protected $c='c';
protected $d='d';
}
家长是保留名称。 在Parent1类中,您可以看到$ a和$ b被删除。 将$ c/$ c更改为受保护。
其他的解决办法是:
class Parent1 {
private $a;
private $b;
}
class Child1 extends Parent1 {
private $c='c';
private $d='d';
function foo(){
foreach(get_object_vars($this) as $name => $value){
echo "$name holds $value<br>";
}
}
}
在儿童
编辑
对不起唤醒旧的文章把FOO。我觉得我有这个一个较好的解决方案(实际上2个解决方案): 第一种是使用一个中产阶级将创造家长和孩子之间的屏障:
abstract class Parent1 {
private $a;
private $b;
abstract function foo();
}
class ParentClone1 {
function foo(){
foreach(get_object_vars($this) as $name => $value){
echo "$name holds $value<br />";
}
}
}
class Child1 extends ParentClone1 {
protected $c='c';
protected $d='d';
}
$c = new Child1();
$c->foo();
// c holds c
// d holds d
另一个解决方案是使用能见度:
如果您从类内部调用get_class_vars()/ get_object_vars(),它会看到所有变量(包括private/protected)。如果你从外面跑它只会看到公众:
function get_object_vars_global($class){
return get_object_vars($class);
}
abstract class Parent1 {
private $a;
private $b;
function foo(){
foreach(get_object_vars_global($this) as $name => $value){
echo "$name holds $value<br />";
}
}
}
class Child1 extends Parent1 {
public $c='c';
public $d='d';
}
$c = new Child1();
$c->foo();
因为这将导致类字段公开,我会去第一个解决方案。
foo函数识别$ a和$ b,因此您会看到它们。父类不知道Child类,所以它不会识别它是私有的。 它不会识别$ c和$ d,因为它们是私人的。 – galchen
即使Child类是最初调用的类吗? 即使没有办法使公共的儿童属性,是否至少有一些方法,使其不承认父母的属性? – someSyl
即使原来的类被调用。如果您将在全球范围内执行此操作,则它也不会识别它们。你可以使$ c/$ d受到保护,尽管 – galchen