【问题标题】:How to create nested PHP value object? (class)如何创建嵌套的 PHP 值对象? (班级)
【发布时间】:2011-09-06 15:01:59
【问题描述】:

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

$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"}]}}

【问题讨论】:

  • 是的,使用数组,它要简单得多...如果你想使用对象,那么你首先必须将一个空对象分配给$resp->CategoryListResp,比如你为$resp 做的,等等……
  • 您遇到问题了吗?该代码应该按原样工作。
  • 代码工作正常,但我想知道如何制作更明确的类。上面的 json 是用一个简单的print json_encode($resp); 输出的

标签: php arrays class


【解决方案1】:

您还可以使您的类更明确:

    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

您可以根据需要修改此概念。

【讨论】:

  • 这更符合我的要求。但是我现在可以看到,显式定义类并没有带来太多好处。我最终只使用了似乎是“PHP方式”的数组:)
  • 事实上,我只做了一半来展示这个概念并保留你的-> 符号用于构造。我扩展了我的答案以展示班级概念的全部力量。但同样,您可能需要根据自己的需要调整它
【解决方案2】:

你已经快到了:

$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 更好。

【讨论】:

    【解决方案3】:

    数组是更简单的方法(正如@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);
    

    干净简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2014-01-10
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多