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 в Child
EDIT
Извините, что разбудил старый пост. Я думаю, что у меня есть предпочтительное решение (на самом деле 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();
, поскольку это приведет к тому, что поля класса станут открытыми, я бы выбрал первое решение.