通过PHP传递复杂对象

通过PHP传递复杂对象,php,class,serialization,get,Php,Class,Serialization,Get,我一直在研究,但我找不到任何方法来做这件事 我需要在不同页面之间传递一个复杂PHP类的实例(由属性、函数、数组等组成)。对象的变量称为$Model我一直在尝试使用GET方法和“序列化”/“取消序列化”,但我无法在新页面中检索对象 我试图传递对象,如下所示: echo '<a href="index.php?modelobject='.serialize($Model).'">Pass Model Object</a>'; 我是否应该尝试一种完全不同的方法,或者这种方法应

我一直在研究,但我找不到任何方法来做这件事

我需要在不同页面之间传递一个复杂PHP类的实例(由属性、函数、数组等组成)。对象的变量称为
$Model
我一直在尝试使用GET方法和“序列化”/“取消序列化”,但我无法在新页面中检索对象

我试图传递对象,如下所示:

echo '<a href="index.php?modelobject='.serialize($Model).'">Pass Model Object</a>';
我是否应该尝试一种完全不同的方法,或者这种方法应该有效,但我只是做错了什么


提前感谢您的时间

在这种情况下,您的两个最佳选择是:

  • 使用
    $\u会话
    变量。您可以将对象另存为
    $\u SESSION['Model']
    ,并在需要使用它的每个页面上访问它。确保调用
    session_start()以恢复会话
  • 在URL中使用
    urlencode(序列化($Model))
    ,并在下一页使用
    urldecode()
    ,以确保URL中没有编码问题
    json\u encode()
    json\u decode()
    对于对象到字符串的序列化也是一个很好的选择
  • 警告:我不鼓励序列化类并将结果放置在最终用户可读的位置。这可能会透露更多关于您的应用程序的信息,而不是您应该公开披露的信息。
    让我们先弄清楚一些术语。我想你知道这件事,但我要说清楚。。。类既是定义对象行为的代码,也是定义数据(属性)的代码。实例是指在类上使用
    new
    关键字,使用该类定义创建可用对象

    根据PHP工作的本质(通常),所有实例都会在页面加载后卸载和删除。它不能保存在内存中,以便在第二页上使用

    通常,您会创建一个包含要在页面之间传递的类定义的文件,并在每个页面上创建该类的新实例

    如果您试图在页面之间保持状态,您应该查看如果您选择使用会话,并且希望在会话中保留类的实例,请记住我上面所说的-它将被删除并在页面之间重新创建。您需要确保您的类已设置为重新加载操作所需的所有内容。PHP提供了一个
    \uuuu wakeup()
    在这个方法中,您需要将对象恢复到上次页面加载时的状态


    在页面(或页面加载)之间传递数据的其他方法是HTTP GET或POST的数组

    $data = array( 1,2,3,4, 'a' => 'abcd' );
    $query = http_build_query(array('aParam' => $data));
    $url = 'somepage.php?data=' . $query;
    
    通过在表单字段名称中使用数组表示法,可以创建表单来传递数据数组

    <form action="somepage.php" method="post">
        <input name="option[a][]" value="option a,0">
        <input name="option[a][]" value="option a,1">
        <input name="option[b][]" value="option b,0" />
        <input name="option[b][]" value="option b,1" />
        <input name="option[]" value="option 0" />
    </form>
    
    
    
    按如下方式访问此数据:

    if(isset($_GET['modelobject'])) //$_GET when used in a link!
    {
        $ModelObjPost = unserialize($_GET['modelobject']); //$_GET when used in a link!
        echo "POST: Model Object retrieved<br>";
        var_dump($ModelObjPost);
    }
    
    <?php
    
    echo $option['a'][0];
    echo $option['a'][1];
    echo $option['b'][0];
    // etc
    

    为什么不使用会话?您可能需要使用urldecode来获取正确的字符串。如果不知道到底发生了什么,很难为您提供更好的替代方案,但这肯定不是最佳做法,也不安全,因为用户可以轻松修改发送到服务器的序列化数据。谢谢,Tim!我读过一些关于会话的书(我是PHP新手),我认为它们对我所需要的东西非常有用。。。不过,在本例中,由于我只是为一个项目创建了一种快速原型,我将使用“urlencode”解决方案,但我将查看会话以了解更多有关它们的信息:)谢谢你,本!会话似乎是正确的方式,但我的日程安排很紧(而且只是实现了一个原型,所以安全性现在不是问题)。。。我已经尝试过“urlencode”了,它可以完成任务,所以我会坚持使用它。再次感谢!:)听起来不错!一旦通过了概念验证,就应该将其转换为会话变量:)
    
    <?php
    
    echo $option['a'][0];
    echo $option['a'][1];
    echo $option['b'][0];
    // etc