1

到目前为止,我在所有页面上加载的文件中创建了一个像这样的变量:

<?php

  add_action( 'parse_query', 'my_global_vars' );
  function my_global_vars() {

    /* CUSTOM GLOBAL VARIABLES */
    $variable_name = get_query_var('category_name');

  }

?>

每次我想使用它(在其他文件中),我必须这样做:

<?php

  global $variable_name;

  if( $variable_name = 'news' ){

    // Do something

  }

?>

当我需要在同一个文件中多次使用该变量时,我global $variable_name;会在文件顶部添加,然后$variable_name在其余实例中简单地使用。

但是随着变量数量的增加,我发现管理global $variable_name所有文件顶部的 s 列表变得更加困难。

有没有办法在创建时将变量定义为全局变量并$variable_name在其他任何地方简单地使用?

编辑:一种方法是像这样定义变量:

<?php

  add_action( 'parse_query', 'my_global_vars' );
  function my_global_vars() {

    /* CUSTOM GLOBAL VARIABLES */
    global $variable_name;
    $variable_name = get_query_var('category_name');

  }

?>

$GLOBALS[]并像在其他地方这样使用它$GLOBALS['variable_name']

4

3 回答 3

2

您可以为此使用静态类并保持 OOP:

<?php
    class GlobalVariables {
        private static $vars = array();

        public static function get($name, $default = null) {
            return (isset(self::$vars[$name]) ? self::$vars[$name] : $default);
        }

        public static function set($name, $value) {
            self::$vars[$name] = $value;
        }
    }

    function foo() {
        GlobalVariables::set('foo', 'oof');
    }

    function bar() {
        var_dump( GlobalVariables::get('foo') );
    }

    foo();
    bar(); //oof
?>

演示


或者,您可以使用单例模式:

<?php
    class GlobalVariables {
        private static $instance;

        private $vars = array();

        public static function get() {
            if (empty(self::$instance)) {
                self::$instance = new GlobalVariables();
            }
            return self::$instance;
        }

        public function __get($name) {
            return (isset($this->vars[$name]) ? $this->vars[$name] : null);
        }

        public function __set($name, $value) {
            $this->vars[$name] = $value;
        }
    }

    function foo() {
        GlobalVariables::get()->foo = 'oof';
    }

    function bar() {
        var_dump( GlobalVariables::get()->foo );
    }

    foo();
    bar(); //oof
?>

演示

使用你认为最易读的那个。

GlobalVariables::set('key', 'value');
GlobalVariables::get('key');

或者

GlobalVariables::get()->key = 'value';
GlobalVariables::get()->key;

完全或者,如果您讨厌动态性,只需使用静态变量(但是,这需要您事先创建所有变量):

<?php
    class GlobalVariables {
        public static $foo;
    }

    GlobalVariables::$foo = 'oof';

    var_dump( GlobalVariables::$foo );
?>
于 2013-11-12T17:14:12.847 回答
2

拥有很多全局变量通常很糟糕。它很快就变得一团糟。

如果您真的需要全局变量,最好的方法是使用静态类变量。它们与其他的一样具有全局性,但它们强制执行更好的命名和预先声明,因此最终结果会更好一些。

如果您确实需要普通的全局变量,您也可以使用该$GLOBALS变量,它在每个范围内都可用,并且基本上是所有全局变量的数组。

global $variable_name;
do_something_with($variable_name);

是相同的

do_something_with($GLOBALS['variable_name']);
于 2013-11-12T17:17:41.640 回答
1

在函数外部使用global不会做任何事情。它适用于内部功能。您可以简单地删除您的global陈述。

编辑:我建议您尝试通过构建全局变量来减少它们的数量。将它们分组为数组或对象。例如,代替user_name, user_id, user_is_admin, prefer user['name'], user['id'], user['is_admin'], 那么你只有一个变量 ( user) 来声明为全局变量而不是三个。

于 2013-11-12T16:40:10.400 回答