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实例.但是,如果实例已存在,则您希望返回该实例. 基本上,单身人士是其自身实例的守门人,并且它固执地拒绝让自身存在多个实例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |