了解stdClass对象


Understanding stdClass objects

好吧,我对PHP中的stdClass对象"有点"陌生,我正在尝试了解导出数据/创建API以从数据库中获取相关信息。

所以,我想要的是让用户访问一些信息,比如说数据库或XML文件(不是所有的东西,只是一些部分)。(在这种情况下,它是一个本地sqlite3文件),我想以JSON格式向用户提供数据。

我需要帮助的是什么?简而言之,我想从你那里得到一些建议,以比我现有的更聪明的方式解决"问题"。(我想我的方法有点……丑陋的解决方案。

这是我导出的结构的当前导出(没有JSON编码):http://codepaste.net/965tgj

我在php文件中通过以下方式做到了这一点:($users实际上是sqlite3.db中的数据,我完全理解如何使用,所以我精简了代码:)

$users = array(
    array(
        "id" => 1,
        "user" => "Xavizus"
    ),
    array(
        "id" => 2,
        "user" => "Zariel"
    )
);
$obj = new stdClass();
$obj->auth = true;
$obj->usercount = 2;
$obj->users = array();
for($i =0; $i < $obj->usercount; $i++){
        $obj->users[] = new stdClass();
}
for($i = 0; $i < $obj->usercount; $i++) {
        $obj->users[$i]->id = $users[$i]['id'];
        $obj->users[$i]->user = $users[$i]['user'];
}
print_r($obj);

有更干净的方法吗?还是这是我能追求的最干净的?

使用(object)来强制转换数组会更容易:

$obj = new stdClass();
$obj->auth = true;
$obj->usercount = count($users);
$obj->users = $users;
foreach($obj->users as &$user) {
    $user = (object)$user;
}

然而,我想看看@jeroen的评论:"你应该定义自己的类,并让构造函数接受初始化值。这会更干净。"

class users {
    function __construct($users, $auth=true) {
        $this->auth = $auth;
        $this->usercount = count($users);        
        foreach($users as $user) {
            $this->users[] = (object)$user;
        }
    }
}
$obj = new users($users);

当从fetchArray()分配行数组时,也可以将其强制转换为对象。

你可以在一个for循环中完成,对吗?

而不是

for($i =0; $i < $obj->usercount; $i++){
        $obj->users[] = new stdClass();
}
for($i = 0; $i < $obj->usercount; $i++) {
        $obj->users[$i]->id = $users[$i]['id'];
        $obj->users[$i]->user = $users[$i]['user'];
}

你可以做一些类似的事情

for($i =0; $i < $obj->usercount; $i++){
        $newObject = new stdClass();
        $newObject->id = $users[$i]['id'];
        $newObject->user = $users[$i]['user'];
        $obj->users[] = $newObject;
}