截至目前,我在所有页面上加载的文件中创建了这样的变量:
<?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[]
一样使用它。
答案 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
?>
或者,您可以使用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
?>
使用您认为最具可读性的。
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_name
,user_id
,user_is_admin
,更喜欢user['name']
,user['id']
,user['is_admin']
,那么您只有一个变量({{ 1}})声明为全局而不是三。