【发布时间】:2011-05-03 23:26:38
【问题描述】:
我习惯了 java、objective c 和一点 c++。 现在我想使用 PHP 创建一个网站。我创建了几个类,但为了简单起见:3 个类。
账户 - 数据映射器 - 数据管理器
这意味着我可以从数据库中获取一个帐户。在 DataManager 中,我跟踪所有事情。比如用户的userId。
问题是,通常所有设置的变量都保持“设置”,但现在我正在使用 php,我显然需要使用会话来存储它们。 数据管理器:
<? php
class DataManager
{
// Hold an instance of the class
private static $dm;
private $dataMapper;
private $dictationView;
private $userId;
private function __construct()
{
$this->dataMapper = new DataMapper();
$this->dictationView = new DictationView();
}
// The singleton method
public static function singleton()
{
if (!isset(self::$dm)) {
$c = __CLASS__;
self::$dm = new $c;
}
return self::$dm;
}
// Prevent users to clone the instance
public function __clone()
{
trigger_error('Clone is not allowed.', E_USER_ERROR);
}
function __get($prop) {
return $this->$prop;
}
function __set($prop, $val) {
$this->$prop = $val;
}
}
?>
如果我在单例 DataManager 类中设置 userId,下次我 调用 DataManager 类的一个实例,它不会记住 userId。我想我必须在某个地方处理会话。如何在 DataManager 中以良好的 OOP 方式使用会话?谢谢!
【问题讨论】:
-
当您说“下一次”时,您是指在同一个请求中还是在后续请求中?请记住,PHP 本质上与 HTTP 一样是无状态的。另外,使用
self::$dm = new self;而不是$c = __CLASS__; self::$dm = new $c; -
@Phil Brown PHP 不是无状态的,每种语言在服务器-客户端架构师的请求之间都是无状态的,服务器-客户端架构师处理不同进程中的每个请求。 PHP 可以像任何其他语言一样具有状态。
-
@Itay 我指的是 PHP 没有像 Tomcat 这样的容器。您当然可以使用会话和其他外部存储来维护状态,但如果您来自 Java,这些事情可能并不明显。