加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP维护类状态

发布时间:2020-12-13 17:21:06 所属栏目:PHP教程 来源:网络整理
导读:我想要一个库类来维护同一个请求的状态.我的用例是我想将’messages’传递给类,然后在视图中随时调用它们.可以从应用程序的任何部分添加消息. 我原来是通过静态方法完成的,效果很好.但是,作为lib的一部分,我还需要调用__construct和__destruct(),这不能在静
我想要一个库类来维护同一个请求的状态.我的用例是我想将’messages’传递给类,然后在视图中随时调用它们.可以从应用程序的任何部分添加消息.

我原来是通过静态方法完成的,效果很好.但是,作为lib的一部分,我还需要调用__construct和__destruct(),这不能在静态类上完成.

这是我想要做的一个非常简单的例子:

class Messages
{
  private static $messages = array();

  public function __construct()
  {
    // do something
  }

  public function __destruct()
  {
    // do something else
  }

  public static function add($message)
  {
    self::$messages[] = $message;
  }
  public static function get()
  {
    return self::$messages;
  }
}

然后,我可以在代码中的任何位置添加消息

Messages::add('a new message');

我想尽可能避免使用静态(可测试性).我看过DI,但这似乎不合适,除非我遗漏了什么.

我可以创建一个类(非静态),但是如何确保所有消息都写入同一个对象 – 以便我以后可以检索它们?

解决这个问题的最佳方法是什么?

解决方法

我看起来你可以从使用Singleton模式中受益 – 它是为一个在整个请求中只有一个实例的对象而设计的.基本上,您创建一个私有构造函数和一个静态方法来检索唯一的实例.这是一个单例的例子,它将完成你描述的内容.

<?php
class Messages
{
    private static $_instance;
    private $_messages = array();

    private function __construct() {
        // Initialize
    }

    static public function instance() {
        if (! self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function add_message( $msg ) {
        $this->_messages[] = $message;
    }

    public function get_messages() {
        return $this->_messages;
    }

    private function __destruct() {
        // Tear-down
    }
}

$my_messages = Messages::instance();
$my_messages->add_message( 'How now,brown cow?' );
// ...
$your_messages = Messages::instance();
$msgs = $your_messages->get_messages();
echo $your_messages[0]; // Prints,"How now,brown cow?"

由于构造函数是私有的,因此只能在对象本身的方法中创建Messages对象.由于您有一个静态方法instance(),您可以从那里创建一个新的Messages实例.但是,如果实例已存在,则您希望返回该实例.

基本上,单身人士是其自身实例的守门人,并且它固执地拒绝让自身存在多个实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读