在两个函数中使用变量

时间:2016-04-25 作者:Boris Kozarac

在两个函数中使用具有相同数据的变量的正确方法是什么?下一种方法是好的做法吗?我在函数中设置了一些这样的变量。php

    $a = array(\'asdf\', \'asdf\', \'asdfasd\');

    add_filter( \'query_vars\', \'themeslug_query_vars\' , 10, 1 );
    function themeslug_query_vars( $qvars ) {
      global $a;        
      ...
    }


    add_action(\'pre_get_posts\', \'search_pre_get_posts\');
    function search_pre_get_posts($query){
      global $a;
    }

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

作为一种良好的编码实践,全局变量最好是有问题的,最坏是危险的。如果可能的话,应该尽量避免。为什么?因为如果其他插件开发人员也决定定义$a 作为全球?该插件所做的一切都将覆盖您的全局$a 而你的可能会对他们的造成严重破坏。

WordPress在其自己的代码中使用了这么多这样的代码,这开创了一个糟糕的先例,但好消息是,您不必这样做,而且在大多数情况下,您可以避免增加已经存在的混乱。

避免全局变量的一种简单方法是将变量包装到另一个将返回值的函数中:

function my_theme_array() {
    return array(\'asdf\', \'asdf\', \'asdfasd\');
}
这将允许您从其他函数中检索它,同时将其保留在本地范围内,避免与其他代码冲突:

function themeslug_query_vars( $qvars ) {
  $a = my_theme_array();        
  ... // Now use $a for whatever.
}

function search_pre_get_posts($query){
  $a = my_theme_array();
}
如果希望能够更改函数返回的内容,而不是将数组硬编码到my_theme_array() 函数,您可以将函数设置为获取将更改数组当前设置值的参数:

function my_theme_array_ver_2( array $new_values = null ) {
    static $my_array = array(\'asdf\', \'asdf\', \'asdfasd\'); // default values
    if ( isset( $new_values ) ) {
        $my_array = $new_values;
    } else {
        return $my_array;
 }
因此,现在可以调用函数来设置其返回值:

my_theme_array_ver_2( array( 1, 2, 3 ) );
或者,您可以简单地要求它返回当前设置的任何值:

$a_this_time_around = my_theme_array_ver_2();

SO网友:fuxia

您的阵列是state, 您的功能是behavior. 结合状态和行为的标准方式是object. 这正是制作对象的目的。

创建一个类,将数组传递给其构造函数,并将其公共方法作为回调分配给挂钩。这样,您就可以很好地封装所有内容,使其可读性和可测试性。也许你可以在其他项目中重用这个类。

示例:

namespace WPSE;

class QueryVars
{
    private $vars;

    public function __construct( array $vars )
    {
        $this->vars = $vars;
    }

    public function add_query_vars( array $wp_vars )
    {
        foreach ( $this->vars as $key => $value )
            $wp_vars[ $key ] = $value;

        return $wp_vars;
    }

    public function pre_get_posts( \\WP_Query $query )
    {
        foreach ( $this->vars as $key => $value )
        {
            if ( $query->get( $key ) )
            {
                // do something
            }
        }
    }
}
然后注册回调:

$my_query_vars = new \\WPSE\\QueryVars(
    [
        \'hello\' => \'world\',
        \'foo\'   => \'bar\',
    ]
);
add_filter( \'query_vars\', [ $my_query_vars, \'add_query_vars\' ] );
add_action(\'pre_get_posts\', [ $my_query_vars, \'pre_get_posts\' ] );

相关推荐

Class variables in shortcodes

不知道我做错了什么,但我有以下代码:class the_shortcode { //Define Class Variables private $var; public function __construct() { add_shortcode( \'the_single\', array( $this, \'shortcode_2\' )); }&#