对象提取属性


Object extract properties

我有一个这样的对象:

object(stdClass)#27 (1)
{
    [0] => object(stdClass)#26 (6)
    {
        ["_id"] => object(MongoId)#24 (1)
        {
            ["$id"] => string(24) "4e6ea439caa47c2c0c000000" 
        }
        ["username"] => string(16) "wdfkewkghbrjkghb"
        ["email"]=> string(24) "wdhbfjkwhegerg@€rg.efg"
        ["password"]=> string(32) "4297f44b13955235245b2497399d7a93"
        ["slug"]=> string(16) "wdfkewkghbrjkghb"
        ["insert_datetime"]=> string(19) "2011-09-13 12:09:49" 
    } 
} 

我将这个对象赋值给$user

我无法访问这个对象属性执行$user->username,因为我收到消息:

未定义属性:stdClass::$username

如果我执行var_dump(get_object_vars($user)),它返回一个空数组。

如何获取属性?如果可以避免的话,我不想使用循环。


过程如下:

  1. 从mongo_db检索结果:

    $returns = array();
    while ($documents->hasNext())
    {
        if ($this->CI->config->item('mongo_return') == 'object')
        {
            $returns[] = (object) $documents->getNext();    
        }
        if ($this->CI->config->item('mongo_return') == 'array')
        {
            $returns[] = (array) $documents->getNext();
        }
    }
    if ($this->CI->config->item('mongo_return') == 'object')
    {
        return (object)$returns;
    }
    
    if ($this->CI->config->item('mongo_return') == 'array')
    {
        return $returns;
    }
    
  2. 向模型传递数据

    function populateBy($what = false) {
        return $this->mongo_db
                    ->where($what)
                    ->get($this->tb['users']);
    }
    
  3. 绝对抓取控制器结果:

    $what = array(
        'email'=>$email,
        'password'=>$password,
        'confirm'=>'1'
    );
    $user  = $this->model_user->populateBy($what);
    

正如gilden所说,您正在寻找的属性是子对象的属性。但是,他忽略了对象属性访问与数组元素访问不同。

您在这里面临的真正问题是,您已经将数组转换为对象,现在您有了一个数字属性名称。要获取属性,必须使用像$user->0->username这样的语法,但显然这是无效的,因为0不是一个有效的变量名。

来自文档:

如果将对象转换为数组,则结果为数组元素是对象的属性。键是成员变量整数属性是达不到的 [sic] ;类前加上私有变量的类名变量名;受保护的变量前面有一个'*'变量的名字。这些前置值的两边都有空字节。这会导致一些意想不到的行为:

函数get_object_vars再次转换回数组,以便看起来可以工作,但实际上任何事情都可能发生:行为未指定,因为对象元素在中间阶段呈现为不可访问的。同样,$user->{'0'}->username可能对你有用,但我会避免它。

不幸的是,这意味着你必须改变代码的工作方式:不要将数字索引数组转换为对象。

您的username属性不在您要查找的地方。试着

$username = $user[0]->username;

EDIT尝试这给了我一些意想不到的结果。我得到"Cannot use object of type stdClass as array"所以我认为你应该使用foreach循环

// $users is the object in this sample
foreach($users as $user)
{
    $username = $user->username;
}

EDIT 2你可以使用get_object_vars

$users = get_object_vars($users);
$username = $users[0]->username;