0

假设我们有一个 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;
                }
            }
        }
    }
4

1 回答 1

0

我不知道 ASP 做了什么,但尝试在不同语言之间创建某种序列化并不是最好的解决方案。

您应该定义一个 JavaScript 和 PHP 可以相互通信的协议。JS 和 PHP 端将特定值加载到它们自己的对象结构中。

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

public function loadJSON(array $data) {
    $this->title = $data['Title'];
    ...
}
于 2013-03-24T18:13:52.907 回答