На данный момент я создаю такую переменную в файле, который загружен на всех страницах:
<?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
везде?
EDIT: Один из способов – определить переменную следующим образом:
<?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']
другом месте.
Наличие большого количества глобальных варов обычно плохое. Это становится беспорядком очень быстро.
Если вам действительно нужны глобальные переменные, лучшим подходом является использование переменных статического класса . Они столь же глобальны, как и другие, но они обеспечивают лучшее именование и предварительную декларацию, поэтому конечный результат несколько лучше.
Если вам действительно нужны обычные глобальные вары, вы также можете использовать переменную $GLOBALS
, она доступна во всех областях и в основном представляет собой массив всех глобальных переменных.
global $variable_name; do_something_with($variable_name);
такой же как
do_something_with($GLOBALS['variable_name']);
Вы можете использовать для этого статический класс и сохранить его ООП:
<?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 ?>
ДЕМО .
Используйте то, что вы считаете наиболее читаемым.
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 ); ?>
Использование global
внешней функции не делает ничего. Он предназначен для внутренних функций. Вы можете просто удалить свои global
заявления.
Изменить: я предлагаю вам уменьшить количество глобальных переменных, которые вы создали, структурируя их. Группируйте их в массивы или объекты. Например, вместо user_id
, user_id
, user_is_admin
, предпочитают user['name']
, user['id']
, user['is_admin']
, тогда у вас есть только одна переменная ( user
), объявляющая как глобальная, а не третья.