我是否需要在类中的每个方法中获取PHP类对象?

时间:2010-01-16 23:36:38

标签: php class object

我正在研究一些PHP类,我有一个用于设置和获取会话变量值的会话类,我需要在每个其他类中访问这个会话类对象,所以我在会话中创建了一个单例方法类,然后在其他类的方法中,我可以像这样调用会话对象....

$session = Session::getInstance();

这会将会话对象返回给我使用,或者如果尚未启动会话对象,则启动它。

所以我的问题是,如果我有一个用户类和一个数据库类,并且每个类都有10个方法需要访问会话对象,那么我是否需要在每个方法中运行上面的代码或者只需1个在课堂内的时间然后所有的方法都会有吗?我是新手,所以我不确定???感谢

5 个答案:

答案 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的答案:)