2014-12-05 70 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)