我可以检索以前使用过的物体吗?

时间:2009-09-24 22:04:07

标签: php oop

有什么方法可以在PHP中持久化对象? 我在脚本中创建了一些对象,但每次运行脚本时我都要创建它们(除非我将它保存到DB中,否则会丢失它们的状态)。

我知道变量可以用$ _SESSION全局持久化,但我应该在其中保存对象吗?

如果无法持久化对象,那么在PHP中使用OOP有什么用呢?

6 个答案:

答案 0 :(得分:4)

在将对象存储在会话中之前序列化对象:

$s_obj = serialize($myObj);
$_SESSION['myObj'] = $s_obj;

以后,检索并重建它:

$s_obj = $_SESSION['myObj'];
$myObj = unserialize($s_obj);

答案 1 :(得分:3)

无需序列化对象:

<?php

class A
{
    protected $name;
    public function __construct($name) { $this->name = $name; }
    public function getName() { return $this->name; }
}

session_start();

if (isset($_SESSION['obj'])) {
    die( $_SESSION['obj']->getName() );
} 

$_SESSION['obj'] = new A('name');

?>

答案 2 :(得分:1)

同意jcinacio,在插入$ _SESSION之前无需序列化值。 php将在每个页面请求/结束时为您管理序列化/反序列化。

持久化对象/会话的另一种方法是将它们保存在文件/数据库中,“模拟”php行为。在这种情况下,您需要序列化值以将它们转换为字符串,并在从数据库检索后将它们反序列化以将它们转换回对象。

您可能还对要保存的对象的__sleep和__wakeup“Magic Methods”[0]感兴趣。在序列化/反序列化对象,执行诸如连接/断开数据库等操作时调用这些方法。

[0] http://php.net/oop5.magic

答案 3 :(得分:1)

请注意,如果您的状态在各个用户之间真正共享,则您不希望使用$ _SESSION。 $ _SESSION仅在同一用户会话中可用 - 即如果您同时在该站点上有50个用户,则每个用户必须至少支付一次计算罚金。

在这些情况下,您可能希望使用基于内存(memcache)缓存的永久磁盘。

答案 4 :(得分:1)

可以使用对象持久性,但不会自动提供。您需要自己编写,或使用为您执行此操作的对象层。所以你可能需要一个数据库。

PHP不是一个环境,您的程序会随着时间的推移响应多个页面请求:相反,您的程序将被调用以响应页面请求并在完成后终止。

PHP中面向对象代码的目的是使一整套编程算法和样式成为可能,并使更容易编写更大范围的编码解决方案。是的,它们在单个页面调用中被实例化和销毁,因此您必须在该范例内工作。许多代码库在页面之间或会话中传递对象ID;只要他们需要相应的对象,就会使用该ID对持久存储进行实例化和加载。一个好的对象层将使这变得容易。

答案 5 :(得分:0)

尝试像APC http://www.php.net/apc/

这样的缓存