获取子(继承)类的对象属性 - 排除基类属性

时间:2014-12-05 02:15:59

标签: php oop

我正在使用 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"
}

这可能吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

因此,如果您需要在B类中继承$ color和$ wood,则可以将它们声明为 protected 。如果您不想继承,请将两个变量声明为私有

示例:

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)