加载静态单例的WP_

时间:2017-07-18 作者:Adriano Castro

在我的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();
}
似乎没有再次创建此实例,但是$traceNULL.

我是否遗漏了WordPress层上与对象生存时间相关的内容?

2 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

你只是做错了。问题从使用单例开始,只是永远不要这样做。

您有一类记录器,它可以登录到某个内部缓冲区。所有记录器都登录到同一个缓冲区,因此该缓冲区(trace 在您的情况下)类中的静态数组。没有了get_intance, 只需实例化一个新的记录器和日志。这为您提供了额外的灵活性,可以让几类记录器“输出”到同一缓冲区。

我们剩下的问题是如何检查日志,这是使用静态方法完成的。

我相信这个方案可以被比我更为核心的OOP的人改进,使用singleton相当于使用namespace 在命名空间下编写的代码比单例更易于阅读和使用,只需直接调用函数,无需处理先获取对象的复杂情况,在挂钩中使用函数更容易,等等。

SO网友:Frank P. Walentynowicz

您的功能get_instance 将永远不会创建该类的实例,因为这一行:

$instance = new static();
它应该是:

$instance = new VBWpdb();

结束

相关推荐

merge wordpress plugins

codecanyon-577696-security-ninja codecanyon-2927931-core-scanner-addon-for-security-ninja codecanyon-3686330-scheduled-scanner-addon-for-security-ninja codecanyon-8531381-events-logger-addon-for-security-ninja 所有四个都在zip文件中,所以我想创建一个zip,所以每