我有一个这样的对象:
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))
,它返回一个空数组。
如何获取属性?如果可以避免的话,我不想使用循环。
过程如下:
从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; }
向模型传递数据
function populateBy($what = false) { return $this->mongo_db ->where($what) ->get($this->tb['users']); }
绝对抓取控制器结果:
$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;