这就是我设置单身人士的方式
<?php
class MySingleton
{
private static $instance;
private static $you;
private function __construct()
{
$this->you = "foo";
}
public static function singleton()
{
if (!isset(self::$instance)) {
$className = __CLASS__;
self::$instance = new $className;
}
return self::$instance;
}
public function getYou()
{
return $this->you;
}
public function setYou($val)
{
$this->you = $val;
}
}
?>
在file1.php
中,我这样做:
require_once('session.php');
$session = MySingleton::singleton();
$session->setYou('bar');
echo $session->getYou(); //echoes 'bar'
在file1.php中,我有一个指向file2.php的超链接,我有这个代码:
require_once('session.php');
$session = MySingleton::singleton();
echo ($session->getYou()); //prints 'foo' which gets set in the constructor
它似乎正在为file2创建一个新实例,这就是为什么$you
的默认值为foo
的原因。我哪里错了?为什么我没有得到我在file1.php中使用的实例?
答案 0 :(得分:3)
在一个请求期间,单身人士应该是“单身”。对于其他一切,您必须序列化对象或使用Sessions。
答案 1 :(得分:3)
静态数据仅适用于单个PHP程序。
如果您的两个脚本作为单独的页面运行,则它们不会共享任何状态。
答案 2 :(得分:3)
PHP中的单例仅对当前请求有效(因为HTTP是无状态的)。
如果要保留该对象的状态,请将其保存在会话中:
class MySingleton
{
private static $instance;
private static $you;
private function __construct()
{
$this->you = "foo";
}
public static function singleton()
{
session_start();
if (!($_SESSION['MyInstance'] instanceof MySingleton)) {
$className = __CLASS__;
$_SESSION['MyInstance'] = new $className;
}
return $_SESSION['MyInstance'];
}
public function getYou()
{
return $this->you;
}
public function setYou($val)
{
$this->you = $val;
}
}
答案 3 :(得分:1)
PHP中的单例用于在程序的相同执行期间返回对象的相同实例,而不是在页面加载的不同页面之间返回。你需要的是将对象存储在会话中(将其发送到“睡眠”)并稍后检索它(“唤醒它”),但要注意,它们仍然是不同的实例,一个是另一个的克隆,并且更新了不会更新另一个。