PHP获取对象的纯数字属性

php的对象属性

我们知道获取php的对象属性用箭头:

echo $obj->name;

如果属性名是一个变量,那么可以用:

$var = 'name';
echo $obj->$var;

考虑如下的结构,是一个MongoDB的BSON Object:

stdClass Object
(
    [_id] => 711
    [1] => stdClass Object
        (
            [win] => 8372907
        )

)
echo $obj->_id; // ok
foreach ([1,2,3] as $k) {
    echo $obj->$k; // error: Undefined property: stdClass::$1
}

这类结构在JSON/BSON转换为php对象时很容易碰到,直接获取时会报错的(linux x64 php7.1提示错误,windows 32 php7.2 可以正常获取
测试发现,直接赋值的属性可以直接读取:

$obj = new stdClass();
$obj->{1} = 'attrName is 1';
$obj->{"1abc"} = 'attrName is 1abc';
$obj2 = new stdClass();
$var = "2xyz";
$obj2->$var = "attrName is 2xyz";
$var = 100;
$obj2->$var = $obj;
var_dump($obj);
var_dump($obj2->$var);    // get $obj2->100

结果:

stdClass Object
(
    [1] => attrName is 1
    [1abc] => attrName is 1abc
)
stdClass Object
(
    [1] => attrName is 1
    [1abc] => attrName is 1abc
)

而从MongodbDriver 获取的 BSON 对象则会报错。

获取PHP 对象属性的值

虽然不知道上面过程出错的原因,但是却找到了解决办法:http://php.net/manual/zh/function.get-object-vars.php

array get_object_vars ( object $obj )

返回由 obj 指定的对象中定义的属性组成的关联数组。
BSON对象数字键属性获取:

// BSON $obj
foreach ([1,2,3] as $k) {
    print_r(get_object_vars($obj)[$k]);
}

总结

编程语言是一门活到老学到老的艺术,一直自诩PHP熟练,却仍然有数不尽的知识盲点。

posted @ 2018-12-13 14:02  真理君的宿敌  阅读(1286)  评论(0编辑  收藏  举报