将php对象传递给$.post()

将php对象传递给$.post(),php,ajax,object,Php,Ajax,Object,我想将2个php对象作为数据传递给$.post $(function() { $("button").click(function() { $.post("fight.php",{player: "<?php $player;?>", enemy: "<?php $enemy; ?>"},function(result) { $("#displayFight

我想将2个php对象作为数据传递给$.post

        $(function() {
            $("button").click(function() {  
                $.post("fight.php",{player: "<?php $player;?>", enemy: "<?php $enemy; ?>"},function(result) {
                    $("#displayFight").html(result);
                });
            });
        });
我该怎么做

注意:对于我尝试过的所有方法,我要么得到一些“未知标识符”,要么$\u POST在接收页面上显示为空

编辑:json_编码部分工作,但解码失败。在接收页面上:

$player = json_decode($_POST["player"])

失败并返回错误:
json_decode()期望参数1为字符串,数组给定

要在PHP和Javascript之间轻松通信,您应该正确序列化对象。最简单的方法是在PHP代码中调用json_encode($player)。然后,当您使用PHP再次获取该对象时,需要对其调用json_decode(),并正确初始化该对象。PHP和Javascript无法共享对象的实例。只有序列化数据。

您需要使用,如下所示:

$.post("fight.php",{
    player: <?php echo json_encode($player);?>, 
    enemy: <?php echo json_encode($enemy);?>
}, ... );
$.post(“fight.php”{
玩家:,
敌人:
}, ... );
请注意,
标记周围没有引号
json_encode
将在需要时自动添加它们


除此之外,您还需要了解
json_encode
强加的要求:最重要的是,如果您的对象包含字符串内容(作为属性或任何子对象的属性),那么这些字符串必须用UTF-8编码。

尝试使用
json_encode

{player:}

一个建议是使用JSON编码PHP对象

但是,让我们考虑一下:您有一个生成输出的PHP脚本。该输出(包含此Javascript片段和2个对象)被发送到执行它的客户端(浏览器),并通过AJAX调用将这两个对象重新发送回服务器

因此,另一种想法可能是简单地在会话的整个时间内将对象存储在服务器端,并且只发送一个标识符而不是整个对象:

<?php
    // apologies for errors - my PHP's rusty
    $_SESSION[$player->uuid()] = $player;
    $_SESSION[$enemy->uuid()] = $enemy;
?>
$.post("fight.php",{player: "<?php $player->uuid();?>", enemy: "<?php $enemy->uuid(); ?>"},function(result) {
    // ...
});
如果您使用传统框架构建数据库驱动的应用程序,这一点尤其有效,因为您的对象可能存储在数据库中,并且可以轻松地从数据库中读取-这可能是比使用
$\u会话
阵列更好的解决方案:

// if recollection serves this is CakePHP-ish
$player = $this->Player->find($_POST['player']);
$enemy  = $this->Enemy->find($_POST['enemy']);

您可以对它们使用
json\u encode
。您只能通过internet发送文本。你的对象需要能够转换成文本,你能解释一下第一行吗?为什么是[json_encode][1],而不是json_encode($player)?@frrlod-只是一个输入错误。我弄乱了我的降价注释,所以超链接没有正确呈现。我喜欢这个主意。使用会话不会因为过期而出现问题吗?我认为使用DB是一个更好的主意,但只是为了学习。@frrlod:“使用会话不会因为过期而有问题吗?”-这要看情况而定。从第一个请求到AJAX调用之间有多长时间?您是否可以控制服务器的配置,以便更改过期时间?此外,这些对象的生命周期/范围是什么?在决定会话数据还是DB更好时,这些都是您应该问的问题。一开始它似乎很管用,但当从$\u POST中取出数据时,每个对象都会显示为一个数组。如果我尝试对它们进行json_decode(),我会得到一条错误消息:“son_decode()希望参数1是字符串,数组给定”。知道为什么吗?@frrlod:jQuery确保从PHP读取时序列化的表单将转换为数组;实际上是PHP从POST数据创建了数组。没有办法让PHP从这些数据中为您提供一个对象,因此从这一点上讲,您就只能靠自己了。正确的解决方案取决于您希望从请求中得到什么类型的对象。@frrlod:对于最简单的情况(没有子对象的普通
stdClass
对象),只需
$player=(object)$\u POST['player']
就足够了。@frrlod:对于最困难的情况(例如,状态保存在非公共变量中的复杂对象)您需要编写代码,将数组形式反序列化为您想要的形式(我就是这样做的)。如果遇到这种情况,您也可以使用
序列化
/
反序列化
并传递字符串,而不是使用
json\u encode
,但这种方法仍然需要您提供自定义代码,并且有一些我不关心的缺点(主要是:您不能“分块”传递对象数据)对于JS和/或HTML,您需要从一个地方一次完成所有工作)。感谢您的时间和精力。我相信在这种情况下,一个简单的stdClass就足够了。
<?php
    // apologies for errors - my PHP's rusty
    $_SESSION[$player->uuid()] = $player;
    $_SESSION[$enemy->uuid()] = $enemy;
?>
$.post("fight.php",{player: "<?php $player->uuid();?>", enemy: "<?php $enemy->uuid(); ?>"},function(result) {
    // ...
});
// is this still how PHP handles sessions?
$player = $_SESSION[$_POST['player']];
$enemy  = $_SESSION[$_POST['enemy']];
// if recollection serves this is CakePHP-ish
$player = $this->Player->find($_POST['player']);
$enemy  = $this->Enemy->find($_POST['enemy']);