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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM