-1

给定以下类,为什么get_object_vars返回一个空数组?这仅在我扩展 PHP 时发生,ArrayObject但在文档中我无法找出这种行为的原因。

class Test extends ArrayObject
{
    public $foo;
    public $bar;

    public function setFooBarValues( array $values )
    {
        $this->foo  = !empty( $values['foo'] ) ? $values['foo'] : null;
        $this->bar  = !empty( $values['bar'] ) ? $values['bar'] : null;
    }

    public function getArrayCopy()
    {
        return get_object_vars( $this );
    }
}

运行以下首先设置对象值的代码显示get_object_vars不返回对象的属性。

$object = new Test( array( 'lemon' => 1, 'orange' => 2, 'banana' => 3, 'apple' => 4 ) );
$object->setFooBarValues( array( 'foo' => 'x', 'bar' => 'y' ) );
var_dump( $object->getArrayCopy() );

预期结果:

array(2) {
  ["foo"]=>
  string(1) "x"
  ["bar"]=>
  string(1) "y"
}

实际结果:

array(0) {
}
4

1 回答 1

2

虽然手册中没有解释原因,但该对象似乎在内部处理其所有属性。看看构造函数的第二个参数和手册中提供int $flags = 0的两个标志:

  • ArrayObject::STD_PROP_LIST 对象的属性在作为列表访问时具有它们的正常功能(var_dump、foreach 等)。

  • ArrayObject::ARRAY_AS_PROPS 条目可以作为属性访问(读取和写入)。

常量STD_PROP_LIST是您要用于标准属性访问的内容。为构造函数提供此常量将为您提供您正在寻找的结果:

$object = new Test(
    array( 'lemon' => 1, 'orange' => 2, 'banana' => 3, 'apple' => 4 ),
    ArrayObject::STD_PROP_LIST
);
$object->setValues( array( 'foo' => 'x', 'bar' => 'y' ) );
var_dump( $object->getArrayCopy() );

结果:

array(2) {
  ["foo"]=>
  string(1) "x"
  ["bar"]=>
  string(1) "y"
}
于 2015-03-28T15:39:26.300 回答