【发布时间】:2010-02-07 05:49:32
【问题描述】:
我已经在我的index.php 文件中实例化了一个类。但是后来我使用 jQuery Ajax 调用了一些 PHP 文件,但是它们不能使用我在 index.php 文件中创建的对象。
我怎样才能让它工作?因为我不想创建新对象,因为我创建的对象包含我想要使用的所有属性值。
【问题讨论】:
我已经在我的index.php 文件中实例化了一个类。但是后来我使用 jQuery Ajax 调用了一些 PHP 文件,但是它们不能使用我在 index.php 文件中创建的对象。
我怎样才能让它工作?因为我不想创建新对象,因为我创建的对象包含我想要使用的所有属性值。
【问题讨论】:
使用会话保存对象以供下一个页面加载。
// Create a new object
$object = new stdClass();
$object->value = 'something';
$object->other_value = 'something else';
// Start the session
session_start();
// Save the object in the user's session
$_SESSION['object'] = $object;
然后在从 AJAX 加载的下一页中
// Start the session saved from last time
session_start();
// Get the object out
$object = $_SESSION['object'];
// Prints "something"
print $object->value;
通过使用 PHP 会话,您可以跨多个页面为某个用户保存数据。例如,也许每个用户都有一个购物车对象,其中包含他们想要购买的商品列表。由于您仅将数据存储在 THAT USERS 会话中 - 每个用户都可以拥有自己的购物车对象,该对象保存在每个页面上!
【讨论】:
如果您不想使用会话,另一种选择是 serialize 您的对象并通过 AJAX 调用中的 $_POST 值发送它。不是最优雅的方式,但如果您不想使用会话,这是一个不错的选择。
有关详细信息,请参阅文档中的Object Serialization。
【讨论】:
mm,你应该将$_SESSION["someobj"] = $myobj;保存在session中,并确保当你调用Ajax PHP文件时,这包括定义$myobj的类和其中包含的任何对象的类必要文件。
你能说得更具体点吗?我可以试试。
这就是我创建对象然后将其分配给会话变量的方式:
include(whateverfilethathastheclassorincludeit.php)
$theObject = new TheObjectClass();
//do something with the object or not
$_SESSION['myobject'] = $theObject;
这是我在 Ajax 调用 PHP 文件中访问对象成员的方式:
include(whateverfilethathastheclassorincludeit.php)
$theObject = $_SESSION['myobject'];
//do something with the object
【讨论】:
<kbd> 标签用于非密钥相关问题:) 但仍然+1。
如果您不想移动 index.php 中的对象,请让您的 ajax 向 index.php 发出请求,但添加一些额外的参数(post/get)让您的 index.php 知道要处理它作为 ajax 请求而不返回您的正常网页 html 输出。
【讨论】:
您还没有提供代码,但我猜您需要将您的实例化对象设为全局,以便其他脚本看到它,例如:
$myobject = new myobject();
现在我想在其他地方使用这个对象,可能是在某个函数或类下,或者任何无法识别它的地方,所以我将使用 global 关键字将此对象设为全局,它将是那里也有:
global $myobject;
一旦你有了对象,你就可以把它放到会话中,然后在 Ajax 脚本文件中使用它。
【讨论】:
正如其他人所建议的,$_SESSION 是执行此操作的标准方法,事实上,这是发明会话解决的原因之一。其他选项,即序列化对象依赖于客户端来保存对象,然后将其原封不动地返回。根据对象中的数据,这不是一个好的解决方案,因为 a) 对象可能包含出于安全原因不应在客户端可用的信息,并且 b) 您必须在收到对象后对其进行验证。
也就是说,如果您仍想在客户端使用该对象,那么 JSON 是一种用于序列化对象数据的选项,请参阅JSON functions in PHP。
【讨论】:
根据此处的大多数答案,指的是将对象存储在 $_SESSION 中,与整个对象相比,仅存储需要在 AJAX 中访问的单个属性是否更有效,还是无关紧要?
例如
$_SESSION['object'] = $object;
对比
$_SESSION['property1'] = $object->property1;
$_SESSION['property2'] = $object->property2;
我知道 OP 正在询问有关访问整个对象的问题,但我想我的问题与是否仅访问对象的某些属性有关,而无需访问类的方法来更改对象一次它在 AJAX 中。
【讨论】: