在我的WordPress站点中,我创建了Singleton
在我的自定义插件中,如下所示:
class VBWpdb {
private $trace = array();
public static function get_instance() {
static $instance = null;
if(null === $instance) {
$instance = new static();
}
return $instance;
}
//...
所以,我使用
VBWpdb::get_instance()
在我的代码的许多地方进行填充
$trace
数组(类的第一个变量)。它的作用是跟踪我的代码,这个静态类是插件执行期间的唯一实例。我用任意
var_dump
\'s
问题是。。。我想在加载页面后打印该跟踪,我正在执行以下操作:
add_action(\'wp_loaded\', \'vb_dump_wpdb_trace\');
function vb_dump_wpdb_trace() {
VBWpdb::get_instance()->dump();
}
似乎没有再次创建此实例,但是
$trace
是
NULL
.
我是否遗漏了WordPress层上与对象生存时间相关的内容?
最合适的回答,由SO网友:Mark Kaplun 整理而成
你只是做错了。问题从使用单例开始,只是永远不要这样做。
您有一类记录器,它可以登录到某个内部缓冲区。所有记录器都登录到同一个缓冲区,因此该缓冲区(trace
在您的情况下)类中的静态数组。没有了get_intance
, 只需实例化一个新的记录器和日志。这为您提供了额外的灵活性,可以让几类记录器“输出”到同一缓冲区。
我们剩下的问题是如何检查日志,这是使用静态方法完成的。
我相信这个方案可以被比我更为核心的OOP的人改进,使用singleton相当于使用namespace
在命名空间下编写的代码比单例更易于阅读和使用,只需直接调用函数,无需处理先获取对象的复杂情况,在挂钩中使用函数更容易,等等。
SO网友:Frank P. Walentynowicz
您的功能get_instance
将永远不会创建该类的实例,因为这一行:
$instance = new static();
它应该是:
$instance = new VBWpdb();