【问题标题】:Do I need to grab a PHP class object in every method in a class?我需要在类的每个方法中获取一个 PHP 类对象吗?
【发布时间】:2010-01-16 23:36:37
【问题描述】:

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

$session = Session::getInstance();

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

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

【问题讨论】:

标签: php class object


【解决方案1】:

在单例模式中,您确实必须这样做。

另一种方法可能是将会话对象添加为构造函数中类的受保护成员$session,然后从每个方法中以$this->session 访问它。

如果您想阅读一些关于如何在 PHP 中安排和使用帮助器和库对象的更广泛的讨论,我曾经问过 related SO question,得到了有趣的答案。

【讨论】:

  • 感谢这可能是一个很好的解决方案,而不是一遍又一遍地重复相同的代码,然后我会像这样访问会话对象的函数或变量吗,$this->session->get()或者像这个 $session->get() 或者其他方式?谢谢
  • $this->session->get() 是。 @Pikrass 在他的回答中有一个完整的例子。
【解决方案2】:

在每个类的构造函数中运行您的方法,并将生成的对象存储为实例变量。

class Database {
    private $session;

    function Database() {
        $this->session = Session::getInstance();
    }
}

然后您可以使用 $this->session 在方法中访问您的 Session 实例。

【讨论】:

    【解决方案3】:

    您需要在构造函数中设置会话。不过,为了获得更大的灵活性,最好将会话对象传入:

    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();
    

    【讨论】:

      【解决方案4】:

      因为 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)
          }
      }
      

      这种封装实际上会使您的代码在会话处理发生变化时更容易修改。

      【讨论】:

        【解决方案5】:

        或者,您可以将此 $session 设为全局变量。

        $GLOBALS["session"] = Session::getInstance();
        

        然后您可以从任何地方操作$GLOBALS["session"]

        但是,如果您希望您的代码符合 OOP 的理想化规则,请坚持使用 Pekka 的回答 :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-09
          • 1970-01-01
          相关资源
          最近更新 更多