2
$obj = (object)array('a', 'b', 'c');
$refl = new \ReflectionObject($obj);
$props = $refl->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED);    

foreach($props as $prop)
  print $prop->name;

linefileおよびline(1、2、3 の代わりに)などの奇妙な名前を出力します。なんで?名前は数字であるため無効であることに気付きましたが、なぜこれらのランダムな文字列を取得するのでしょうか?

get_object_vars($obj)何も表示されず、print_r((array)$obj)実際には値が正しく出力されます。


Reflection が数値プロパティを表示できない場合、それらを無視するようにする方法はありますか?


また、多くの SPL インターレーター ( ArrayObjects、SplFixedArrays、SplHeaps など) でも発生します。どうやら、この動作は一部の PHP 5.3 バージョンにのみ存在します。PHP 5.4 では何も表示されません。


関連する PHP のバグと私の解決策 (property_exists無効な名前は無視されます):

if(version_compare(PHP_VERSION, '5.4') < 0){
  $props = array_filter($props, function($prop) use($obj){
    return !$prop->isPublic() || property_exists($obj, $prop->name);
  });
}
4

2 に答える 2

1

それはバグを修正しない...または奇妙なphp動作です。そのため、数値キーについて確信が持てない場合は、オブジェクト タイプのキャストを使用できません。このようなものを使用してください

$obj = new \stdClass();
foreach($array as $key=>$value)
    $obj->{$key} = $value;

PHP の奇妙な動作から、別の汚いトリックを使用できます。リフレクションなしですべてのプロパティを取得します。

$obj = (object) array('a', 'b', 'c');
$obj->{0}='asd';
while (list($field, $value) = each($obj))
    {
    var_dump($field, $value);
    }

また、この問題は stdClass オブジェクトでのみ発生すると思います。

于 2013-03-28T01:24:09.283 に答える
1

配列をオブジェクトにキャストすると、配列のキーがプロパティ名に変換され、値がその値に変換されます。

配列には数値キーがあります。オブジェクトには数値プロパティがあります。これは一種の無効です。

あなたが本当に欲しいもの:

$obj = (object) array('a'=> null, 'b' => null, 'c'=> null);

于 2013-03-28T00:45:49.400 に答える