如何不使用全局变量包含一个类/实例

时间:2013-08-20 作者:Andrea Puiatti

我想补充一下http://mobiledetect.net/ 类到我的模板。在模板的每个部分中动态使用此类的最佳方法是什么?

目前,我只是在函数中加载了这个类。像这样的php

    function devicecontrol() {
    require_once \'_/inc/md/Mobile_Detect.php\';
}
add_action(\'wp_loaded\', \'devicecontrol\', \'1\');
但要使用它,我必须首先在每个页面模板中创建一个实例

$detect = new Mobile_Detect;
我知道全局变量不是一个好的解决方案,那么哪种方法是包含此类类的最佳方法?

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

全局变量不是一个好的解决方案

是的,我多次听到这句话,但正如您所经历的,有时某些变量需要到处访问。

一些现代PHP框架实现高级模式,如IOC 这对这类事情很有帮助,但wordpress在这方面缺乏,这就是为什么WP中使用了很多全局变量。

一般来说,在PHP中,解决方案包括:

  1. Sigleton. 许多程序员(特别是来自PHP以外的其他语言)说,singleton很糟糕,因为它是一种伪装的全局变量。在我看来,当你不能依赖于IOC的实现时,单件式比“纯”全局式要好,但对于简单的任务来说,没有必要实现这种模式
  2. 全局。在PHP中,关键字global 让全球VAR闻起来少一点。如果你使用得当,globals就不会那么差劲了。E、 g.在函数内部使用它们不是一个很坏的解决方案
严格地讲,如果你讨厌全局变量,静态方法就足以替代全局变量。

class MyDetect {

  static $detect = NULL;
  static $deviceType = NULL;

  static function detect() {
    if ( is_null(self::$detect) ) {
      require_once \'_/inc/md/Mobile_Detect.php\';
      self::$detect = new Mobile_Detect;
      self::$deviceType = ($detect->isMobile() ? ($detect->isTablet() ? \'tablet\' : \'phone\') : \'computer\'); 
    }
  }

}
需要插件中包含类的文件,然后

add_action(\'wp_loaded\', array(\'MyDetect\', \'detect\') );
当你需要$detect 变量(移动检测实例)使用MyDetect::$detect 当你需要$deviceType 变量使用MyDetect::$devicType

编辑:用法示例

function add_mobile_scripts() {
   wp_enqueue_script(\'my_script_for_mobiles\', \'the_script_url_here\' );
}

function add_phone_scripts() {
   wp_enqueue_script(\'my_script_for_phones\', \'the_script_url_here\' );
}

function add_tablet_scripts() {
   wp_enqueue_script(\'my_script_for_tablets\', \'the_script_url_here\' );
}

function add_desktop_scripts() {
   wp_enqueue_script(\'my_script_for_desktops\', \'the_script_url_here\' );
}

function addDevicesScripts() { 
  if ( MyDetect::$deviceType == \'phone\' || MyDetect::$detect == \'tablet\' ) {
    add_mobile_scripts();
    if ( MyDetect::$deviceType==\'phone\' ) {
      add_phone_scripts();
    } else {
      add_tablet_scripts();
    }  
  } else {
     add_desktop_scripts();
  }
}

add_action( \'wp_enqueue_scripts\', \'addDevicesScripts\' );

结束

相关推荐

Options.php loop won't show!

我正在为存储在选项中的本地主机上的主题创建选项面板。php文件。我的选项面板将有两个主回路。第一个是列出不同的部分,第二个将创建这些部分。我刚刚编写了第一个循环,它在运行时不会显示任何内容。此循环和一些周围html的代码是:<aside> <nav> <ul> <?php foreach ($options as $value){ switch