JSON到自定义PHP对象实例

时间:2013-03-24 18:03:27

标签: php json object casting

假设我们有一个PHP类发票和项目:

class Item{
    public $CID;
    public $CATID;             // category id...
    public $net;
    public $t1;
    public $t2;
    public $total;
}

class invoice{
    public $items = array();        //array of object item;
    public $date;
    public $title;
    public $description;
    public $subtotal;
    public $t1;
    public $t2;
    public $total;


    public function __construct(){
    }
}

对象发票包含几种方法,例如:添加项目,删除项目,重新计算,设置税金和东西......这有点复杂。 我想出了如何使用以下方法将此对象的实例解析为javascript:

$json=json_encode((array)$invoice);

然后在javascript中,我有完全相同的对象定义,相同的方法,然后我使用:

test = jQuery.parseJSON('<?php= $json?>');
test.__proto__ = invoice.prototype;

到目前为止,我的测试变量现已成为javascript中的发票对象,我可以使用发票和项目javascript类中定义的方法。经过几次操作后,我可以使用以下内容将对象重新发送到php(比如ajax):

function send_ajax(){
    $.ajax({
        url: "ajax.php",
        type: "POST",
        data: ({
             invoice:JSON.stringify(test)
        }),
        success: function(msg){
            $('#response').html(msg);
        }
    });
}

然后,服务器端我使用json_decode将json转换为数组。这就是我被困住的地方!我无法将$ invoice []或stdObjcect投射到我的发票类中。我也用ASP .net C#编写代码,这样的事情很容易实现。我需要实现这样的事情的原因很简单:我需要使用我的php发票类中的方法到解析的JSON ......任何人都有想法?

我之前唯一想到的是手动解析json对象......还有其他“内置”方式

  public function __construct($json = null){
        if ($json != null){
           $json=json_decode($json, true);

           for($i=0;$i<count($json[items]);$i++){
               $newItem= new Item();
                foreach ($json[items][$i] as $key=>$value){
                    $newItem->$key=$value;
                }
               array_push($this->items,$newItem);
           }
            foreach($json as $key =>$value){
                if(!is_array($value)){
                $this->$key=$value;
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

我不知道ASP的作用,但尝试在不同语言之间创建某种序列化并不是最佳解决方案。

您应该定义JavaScript和PHP之间相互通信的协议。 JS和PHP方面将特定值加载到它们自己的对象结构中。

PHP类可能有一个方法可以知道特定的数组结构以及要放入哪些实例变量的字段。

public function loadJSON(array $data) {
    $this->title = $data['Title'];
    ...
}