如何创建嵌套PHP值对象?(类)


How to create nested PHP value object? (class)

我想使用类语法创建以下内容:

$resp = new stdclass;
$resp->CategoryListResp->category[0]->categoryId = 1;
$resp->CategoryListResp->category[0]->categoryName = "Spel"; 
$resp->CategoryListResp->category[0]->iconUri = "PictoSpel.png";
$resp->CategoryListResp->category[1]->categoryId = 2;
$resp->CategoryListResp->category[1]->categoryName = "Transport";
$resp->CategoryListResp->category[1]->iconUri = "PictoTransport.png";

应该很容易,但我找不到这个语法。稍后我将以json格式输出$resp。我知道我也可以使用数组的这个…

json的输出应该是:

{"CategoryListResp":{"category":[{"categoryId":1,"categoryName":"Spel","iconUri":"PictoSpel.png"},{"categoryId":2,"categoryName":"Transport","iconUri":"PictoTransport.png"}]}}

你也可以让你的类更显式:

    class Category {
        public $categoryId = 0, $categoryName = '', $iconUri = '';
    }
    class Resp {
        public $categoryListResp = null;
        public function __construct() {
            $this->categoryListResp = new CategoryListResp();
        }
    }
    class CategoryListResp {
        public $category = array();
    }
    $resp = new Resp();
    $resp->categoryListResp->category[0]->categoryId = 1; 
    $resp->categoryListResp->category[0]->categoryName = "Spel";  
    $resp->categoryListResp->category[0]->iconUri = "PictoSpel.png"; 
    // etc.

添加(根据henq的评论)。为了充分利用类的概念,您需要向类中添加一些方法。然后,您将不会对数组使用->,而是调用相应的方法。例如

class Category {
    public $categoryId = 0, $categoryName = '', $iconUri = '';
    public function __construct($id, $name, $icon) {
        $this->categoryId = $id;
        $this->categoryName = $name;
        $this->iconUri = $icon;
    }
}
class Resp {
    public $categoryListResp = null;
    public function __construct() {
        $this->categoryListResp = new CategoryListResp();
    }
    public function addCategory($index, $id, $name, $icon) {
        $this->categoryListResp->addCategory($index, $id, $name, $icon);
    }
}
class CategoryListResp {
    public $category = array();
    public function addCategory($index, $id, $name, $icon) {
        $this->category[$index] = new Category($id, $name, $icon);
    }
}
$resp = new Resp();        
$resp->addCategory(0, 1, "Spel", "PictoSpel.png");
$resp->addCategory(1, 2, "Transport", "PictoTransport.png");
// etc

你可以根据你的需要修改这个概念

你差不多已经做到了:

$resp = new stdClass();
$resp->CategoryListResp = new stdClass();
$resp->CategoryListResp->category[0]->categoryId = 1;
$resp->CategoryListResp->category[0]->categoryName = "Spel"; 
$resp->CategoryListResp->category[0]->iconUri = "PictoSpel.png";
$resp->CategoryListResp->category[1]->categoryId = 2;
$resp->CategoryListResp->category[1]->categoryName = "Transport";
$resp->CategoryListResp->category[1]->iconUri = "PictoTransport.png";
print_r(json_encode($resp));
/* 
output:
{"CategoryListResp":{"category":[{"categoryId":1,"categoryName":"Spel","iconUri":"PictoSpel.png"},{"categoryId":2,"categoryName":"Transport","iconUri":"PictoTransport.png"}]}}
*/

$resp发送到json_encode。但是,您的代码应该按原样工作。更好的设计是为CategoryListRespCategory创建类定义,而不是仅仅使用stdClass

数组是更简单的方法(正如@felix-kling所建议的)

代码是这样结束的:

$resp = array(
  'CategoryListResp' => array(
    'category' => array(
      array(
        'categoryId'   => 1,
        'categoryName' => 'Spel',
        'iconUri'      => 'PictoSpel.png'
      ),
      array(
        'categoryId'   => 2,
        'categoryName' => 'Transport',
        'iconUri'      => 'PictoTransport.png'
      ),
    ),
  ),
);
print json_encode($resp);