没有'global'关键字创建和使用全局变量?

时间:2013-11-12 16:35:53

标签: php variables global-variables

截至目前,我在所有页面上加载的文件中创建了这样的变量:

<?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列表更加困难。

有没有办法在创建时将变量定义为全局变量,只需在其他地方使用$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[]一样使用它。

3 个答案:

答案 0 :(得分: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
?>

DEMO


或者,您可以使用Singleton模式:

<?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
?>

DEMO

使用您认为最具可读性的。

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 );
?>

答案 1 :(得分:2)

拥有大量的全球变量通常很糟糕。它很快变得一团糟。

如果您确实需要全局变量,最好的方法是使用static class variables。它们与其他产品一样全球化,但它们强制执行更好的命名和预先声明,因此最终结果会更好。

如果你真的需要普通的全局变量,你也可以使用$GLOBALS变量,它在每个范围都可用,基本上是所有全局变量的数组。

global $variable_name;
do_something_with($variable_name);

相同
do_something_with($GLOBALS['variable_name']);

答案 2 :(得分:1)

在函数外部使用global不会执行任何操作。它适用于内部功能。您只需删除global语句即可。

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