全局变量不是一个好的解决方案
是的,我多次听到这句话,但正如您所经历的,有时某些变量需要到处访问。
一些现代PHP框架实现高级模式,如IOC 这对这类事情很有帮助,但wordpress在这方面缺乏,这就是为什么WP中使用了很多全局变量。
一般来说,在PHP中,解决方案包括:
- Sigleton. 许多程序员(特别是来自PHP以外的其他语言)说,singleton很糟糕,因为它是一种伪装的全局变量。在我看来,当你不能依赖于IOC的实现时,单件式比“纯”全局式要好,但对于简单的任务来说,没有必要实现这种模式
全局。在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\' );