通过PHP传递复杂对象
我一直在研究,但我找不到任何方法来做这件事 我需要在不同页面之间传递一个复杂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>'; 我是否应该尝试一种完全不同的方法,或者这种方法应
$Model
我一直在尝试使用GET方法和“序列化”/“取消序列化”,但我无法在新页面中检索对象
我试图传递对象,如下所示:
echo '<a href="index.php?modelobject='.serialize($Model).'">Pass Model Object</a>';
我是否应该尝试一种完全不同的方法,或者这种方法应该有效,但我只是做错了什么
提前感谢您的时间 在这种情况下,您的两个最佳选择是:
$\u会话
变量。您可以将对象另存为$\u SESSION['Model']
,并在需要使用它的每个页面上访问它。确保调用session_start()在这些页面的每一页上编写>以恢复会话
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