-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

理由はマニュアルでは説明されていませんが、オブジェクトはすべてのプロパティを内部的に処理しているようです。コンストラクターの 2 番目のパラメーターと、マニュアルで提供されてint $flags = 0いる 2 つのフラグを見てください。

  • 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 に答える