全局对象和公共方法

时间:2016-01-26 作者:Howdy_McGee

我正在开发一个插件,正在考虑最佳实践。拥有全局对象有多常见?当前打开plugins_loaded 我正在创建类的全局对象:

add_action( \'plugins_loaded\', array( \'Test_Plugin\', \'init\' ) );
...
public static function init() {
    global $testerski;
    $testerski = __CLASS__;
    $testerski = new $testerski;
}
这允许我使用global $testerski 调用任何变量或方法。这是常见的做法吗?

我的另一个担忧是,由于我正在创建一个全局对象,根据我的理解,任何挂钩都必须具有公共功能,以便WordPress可以调用它们。问题是,我可以从全局对象调用这些用于挂钩的函数。例如,我将一些挂钩注册为:

public function __construct() {
    add_action( \'init\',             array( $this, \'test_plugin_setup\' )             );
    add_action( \'template_include\', array( $this, \'test_templates\' )                );
    add_filter( \'cron_schedules\',   array( $this, \'test_add_monthly_schedule\' )     ); 
}

public function test_templates( $template ) {
    ...
}
我可以用$testerski->test_templates(). 既然这个函数不应该直接调用,而且只用于挂钩,那么有没有办法防止像这样直接调用它?这样的事情是危险的还是我想得太多了?

我注意到有些钩子有警告,比如wp_enqueue_scripts 将通知您它的调用不正确。

1 个回复
最合适的回答,由SO网友:Nabil Kadimi 整理而成

这不是常见的做法,但确实有效。更好的方法是使用类和单例模式,就像WooCommerce和许多其他模式一样,您可以:

静态函数(称为instance, getInstance...) 如果尚未创建实例(对象),则创建实例(对象),并返回它Or 返回现有实例让我们继续WooCommerce示例;我们通常这样做来访问全局对象:

global $woocommerce; 
现在我们做到了:

WooCommerce::instance();

# Or with the handy Shortcut
WC();
我想你会喜欢读这些:

WooCommerce::实例()https://docs.woocommerce.com/wc-apidocs/source-function-WC.html#104-119

  • https://docs.woocommerce.com/wc-apidocs/source-function-WC.html#524-534
  • https://en.wikipedia.org/wiki/Singleton_pattern

  • 您可以检查current_filter() 在你的方法里,但如果我是你,我就不会麻烦了。这不是一个威胁,其他开发人员可能想要使用您的代码,所以不要阻止他们。

    相关推荐

    OOP development and hooks

    我目前正在为Wordpress编写我的第一个OOP插件。为了帮助我找到一点结构,a boiler plate 这为我奠定了基础。在里面Main.php 有一种方法可以为管理员加载JS和CSS资产:/** * Register all of the hooks related to the admin area functionality * of the plugin. * * @since 0.1.0 * @access private