我正在研究一些PHP类,我有一个用于设置和获取会话变量值的会话类,我需要在每个其他类中访问这个会话类对象,所以我在会话中创建了一个单例方法类,然后在其他类的方法中,我可以像这样调用会话对象....
$session = Session::getInstance();
这会将会话对象返回给我使用,或者如果尚未启动会话对象,则启动它。
所以我的问题是,如果我有一个用户类和一个数据库类,并且每个类都有10个方法需要访问会话对象,那么我是否需要在每个方法中运行上面的代码或者只需1个在课堂内的时间然后所有的方法都会有吗?我是新手,所以我不确定???感谢
答案 0 :(得分:2)
在Singleton模式中,你确实必须这样做。
另一种方法是将会话对象添加为构造函数中类的受保护成员$session
,然后将其作为$this->session
从每个方法中访问。
如果你想阅读一些关于如何在PHP中安排和使用帮助器和库对象的更广泛的讨论,我曾经问related SO question一次产生了有趣的答案。
答案 1 :(得分:1)
在每个类的构造函数中运行您的方法,并将结果对象存储为实例变量。
class Database {
private $session;
function Database() {
$this->session = Session::getInstance();
}
}
然后,您可以使用$ this-> session。
访问方法中的Session实例答案 2 :(得分:1)
您需要在构造函数中设置会话。但是为了获得更大的灵活性,最好在以下位置传递会话对象:
class User {
private $session;
public function __construct(Session $session) {
$this->session = $session;
}
public function methodOne() {
$stuff = $this->session->getStuff();
// etc...
}
}
// example usage
$session = Session::getInstance();
$user = new User($session);
$user->methodOne();
此方法有助于确保您的User对象不依赖于该特定的Session实现。只要进一步的Session对象具有相同的接口,您的User对象就可以毫无问题地使用它们。
// example usage
$session = SuperSession::getInstance(); // SuperSession is like Session,
// but better! same interface though.
$user = new User($session);
$user->methodOne();
答案 3 :(得分:1)
因为PHP通过引用处理对象,所以从技术上讲,你可以有一个基类来捕获构造函数中的会话实例
abstract class AbstractSessionEnabledClass {
public function __constructor() {
$this->session = Session::getInstance();
}
private $session = null;
}
然后让你的子类扩展这个类
class SomeClass extends AbstractSessionEnabledClass {
public function __constructor() {
parent::__constrcutor(); //this isn't needed if this class has no constructor
}
public function someMethod() {
var_dump($this->session)
}
}
这种封装实际上会使会话处理发生变化时更容易修改代码。
答案 4 :(得分:-1)
或者,您可以将此$session
改为全局变量。
$GLOBALS["session"] = Session::getInstance();
然后,您可以随时随地操纵$GLOBALS["session"]
。
但是如果你想让你的代码达到OOP的理想规则,请坚持使用Pekka的答案:)