有什么方法可以在PHP中持久化对象? 我在脚本中创建了一些对象,但每次运行脚本时我都要创建它们(除非我将它保存到DB中,否则会丢失它们的状态)。
我知道变量可以用$ _SESSION全局持久化,但我应该在其中保存对象吗?
如果无法持久化对象,那么在PHP中使用OOP有什么用呢?
答案 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]感兴趣。在序列化/反序列化对象,执行诸如连接/断开数据库等操作时调用这些方法。
答案 3 :(得分:1)
请注意,如果您的状态在各个用户之间真正共享,则您不希望使用$ _SESSION。 $ _SESSION仅在同一用户会话中可用 - 即如果您同时在该站点上有50个用户,则每个用户必须至少支付一次计算罚金。
在这些情况下,您可能希望使用基于内存(memcache)缓存的永久磁盘。
答案 4 :(得分:1)
可以使用对象持久性,但不会自动提供。您需要自己编写,或使用为您执行此操作的对象层。所以你可能需要一个数据库。
PHP不是一个环境,您的程序会随着时间的推移响应多个页面请求:相反,您的程序将被调用以响应页面请求并在完成后终止。
PHP中面向对象代码的目的是使一整套编程算法和样式成为可能,并使更容易编写更大范围的编码解决方案。是的,它们在单个页面调用中被实例化和销毁,因此您必须在该范例内工作。许多代码库在页面之间或会话中传递对象ID;只要他们需要相应的对象,就会使用该ID对持久存储进行实例化和加载。一个好的对象层将使这变得容易。
答案 5 :(得分:0)
尝试像APC http://www.php.net/apc/
这样的缓存