2014-12-05 153 views
-1

我使用PHP和功能可按get_object_vars()获取子对象属性(继承)类 - 不包括基类的属性

我有两个类

class A 
{ 
    var $color = 'blue'; 
    var $wood = 'oak'; 
} 

class B extends A 
{ 
} 

如果我们运行下面的代码

$B = new B(); 
$B->website = 'stackoverflow'; 

var_dump(get_object_vars($B)); 

输出是

array(3) { 
["color"]=> 
string(4) "blue" 
["wood"]=> 
string(3) "oak" 
["website"]=> 
string(13) "stackoverflow" 
} 

我的理想输出将是

array(1) { 
["website"]=> 
string(13) "stackoverflow" 
} 

这可能吗?

+2

将$颜色和$私人木 – sectus 2014-12-05 02:18:57

回答

1

根据PHP get_object_vars documentation“根据范围获取访问非静态性质的给定对象的”。

在您的代码中,get_object_vars函数是从对象范围外调用的,因此,您将看到public属性。

如果范围是自己的对象(来自类实例内部的调用),则私有属性,受保护属性或私有属性是可见的。 (除静态属性)

所以,如果你需要继承类B $颜色和$木材,你可以声明为保护。如果你不想继承,声明这两个变量为私有

例子:

class A 
{ 
    protected $color = 'blue'; 
    protected $wood = 'oak'; 
} 

class B extends A{ 
    public function __construct(){ 
     echo "SCOPE: Self object: "; 
     var_dump("Color in B: " . $this->color); 
     var_dump("Wood in B: " . $this->wood); 
    } 

    public function get_my_vars(){ 
     echo "SCOPE: Self object: "; 
     echo "My vars"; 
     var_dump(get_object_vars($this)); 
    } 
} 

$B = new B(); 
$B->website = 'stackoverflow'; 

echo "SCOPE: Outside object: B vars"; 
var_dump(get_object_vars($B)); 
$B->get_my_vars(); 

=============== 

Output: 
SCOPE: Self object: 
string 'Color in B: blue' (length=16) 
string 'Wood in B: oak' (length=14) 

SCOPE: Outside object: B vars 
array (size=1) 
    'website' => string 'stackoverflow' (length=13) 

SCOPE: Self object: My vars 
array (size=3) 
    'color' => string 'blue' (length=4) 
    'wood' => string 'oak' (length=3) 
    'website' => string 'stackoverflow' (length=13)