如何解决一个“全球”问题,避免一个被拒绝的主题?

时间:2016-02-26 作者:Knott

我在前面提交了一个WordPress主题,拒绝的原因之一如下:

全局变量应始终位于函数或类中,并且应限制使用;只有在主题确实需要的情况下。强烈建议不要仅仅为了避免全局名称空间中的内容而使用它们,因为它们是糟糕的编码实践。

Im使用Smof Option Framework 对于主题选项,下面是我的一个主题文件中的示例代码:

global $smof_data;
$td_header_manager_wide = $smof_data[\'td_header_blocks\'][\'enabled\'];

if ( $td_header_manager_wide ) {

        foreach ( $td_header_manager_wide as $key=>$value ) {

            switch( $key ) {

                case \'block_main_menu_wide\': // wide menu
                echo \'<div id="td-sticky" class="wide-menu \' . $td_sticky . \'">\';
                echo \'<div id="wide-menu">\';
                include( get_template_directory() . \'/parts/menu-header-logo.php\');
                echo \'</div>\';
                echo \'</div>\';
                break;
  }
}
看来global $smof_data; 应该在一个函数中,但我真的不知道如何完成这项任务以避免包含全局$smof\\u数据;在我需要的所有主题文件中。

使用@jgraup方法更新代码:

function matilda_customize_styles() {

    $css = \'<style type="text/css" media="screen">\';
    if ( ! empty( SMOFData::get( \'td_body_font_family\' ) ) 
        && SMOFData::get( \'td_body_font_family\' ) != \'none\' ) 
    {
        $css .= \'body{font-family:\' . esc_html( SMOFData::get( \'td_body_font_family\' ) ) . \';}\';
    }

}
任何帮助都将不胜感激。谢谢

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

如果您正在处理在全局变量中保存值的框架,那么您对此无能为力。下面是一个将变量包装在静态getter中的示例。

if ( ! class_exists( \'SMOFData\' ) ):

    class SMOFData {

        static public function is( $key, $compare ) {
            $value = static::get( $key );
            return $value === $compare;
        }

        static public function not( $key, $compare ) {
            $value = static::get( $key );
            return $value !== $compare;
        }

        static public function has( $key ) {
            $value = static::get( $key );
            return ! empty( $value );
        }

        static public function get( $key ) {

            global $smof_data;

            if ( ! isset( $smof_data ) ) {
                return null;
            }

            return isset( $smof_data[ $key ] ) ? $smof_data[ $key ] : null;
        }

    }

endif; // SMOFData
要访问数据,只需使用

echo SMOFData::get(\'td_header_blocks\')[\'enabled\'];

function matilda_customize_styles() { 
    $css = \'<style type="text/css" media="screen">\';
    $td_body_font_family = SMOFData::get( \'td_body_font_family\' ); 
    if ( ! empty( $td_body_font_family ) && $td_body_font_family != \'none\' ) {
        $css .= \'body{font-family:\' . esc_html( $td_body_font_family ) . \';}\';
    } 
}

function matilda_customize_styles() { 
    $css = \'<style type="text/css" media="screen">\';
    if ( SMOFData::has( \'td_body_font_family\' ) && SMOFData::not( \'td_body_font_family\', \'none\' ) ) {
            $css .= \'body{font-family:\' . esc_html( SMOFData::get( \'td_body_font_family\' ) ) . \';}\';
    }
}
如果你只想成为自己的全局成员,你也可以将其包装在一个类中。

if ( ! class_exists( \'ThemeData\' ) ):

    class ThemeData {
        private static $_values = array ();

        static public function get( $key ) {
            return isset( static::$_values[ $key ] ) ? static::$_values[ $key ] : null;
        }

        static public function set( $key, $value ) {
            static::$_values[ $key ] = $value;
            return $value;
        }
    }
endif; // ThemeData


// setter
ThemeData::set(\'foo\', \'bar\');

// getter
echo ThemeData::get(\'foo\');

SO网友:Pieter Goosen

首先,我必须祝贺他们的回复,这真的值得一杯啤酒。全球化是邪恶的,人们永远不应该再创造全球化,弄脏全球空间了。WordPress已经把这件事搞得一团糟了。不要再把事情搞得一团糟了。

解决这个全球性问题最简单的方法之一就是创建一个函数,你可以在任何需要它的地方使用它。这是一个样本

function this_is_my_global()
{
    return $my_global_var = \'This is my global value\';
}
你只需打电话this_is_my_global(); 在你需要的地方。

这只是一些非常基本的东西。我建议您阅读以下问题的@kaiser和@gmazzap答案