【问题标题】:Object extract properties对象提取属性
【发布时间】:2011-09-15 15:29:47
【问题描述】:

我有一个这样的对象:

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:这是正确的答案;你为什么删除它?
  • @tomalak-geretkal 我做了一些调查,但我不确定它是否正确。
  • 我及时签出了(在他删除之前)gilden的答案,我证明了 echo $user[0]->username;但它不正确:P,它返回错误:不能使用 stdClass 类型的对象作为数组
  • @gilden:嗯,你的回答是正确的,但不完整。 :P

标签: php arrays object extraction


【解决方案1】:

正如gilden 所说,您要查找的属性是子对象 的属性。但是,他错过了对象属性访问与数组元素访问不同。

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

来自the documentation

如果将对象转换为数组,则结果是一个数组,其 元素是对象的属性。键是成员变量 名称,除了一些值得注意的例外:整数属性是 无法访问 [原文如此];私有变量的类名附加到 变量的名称;受保护的变量前面有一个“*” 变量的名称。这些前置值在两边都有空字节。 这可能会导致一些意外行为:

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

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

【讨论】:

    【解决方案2】:

    您的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;
    

    【讨论】:

    • 检查我的问题是否有这一行:“如果可能,我不想使用循环,谢谢”:P
    • 或者如果放置循环更好,可以将其放入模型函数 populateBy(){} 并返回到控制器,该对象可用于在控制器中执行 $user->username 而没有循环我的意思是:P
    • 对不起。在我们说话的时候,我正在调查它。这让我很好奇。
    • 用 EDIT 2 说:未定义的偏移量:0
    • 怎么样 .. 嗯 .. 在这一点上 .. 可以很好地计算对象数组,如果对象仅包含 1 个数组,则可以很好地从模型向控制器发送一个包含所有内容的重组对象属性所以在控制器中我将能够回显 $user->username;你能帮我做这件事吗? :P
    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2010-11-10
    • 2017-10-25
    • 2021-06-17
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多