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熟練,卻仍然有數不盡的知識盲點。