Использование глобальных переменных внутри плагина

27 сент. 2013 г., 02:42:17
Просмотры: 21.1K
Голосов: 2

Я создаю свой первый плагин и обнаружил, что мне нужно вызывать одни и те же переменные опций в разных частях одной страницы. Поэтому я искал решение и наткнулся на глобальные переменные, которые, похоже, работают для меня. Однако, после прочтения нескольких статей, я заметил, что люди выступают против использования глобальных переменных, и я не совсем уверен, правильно ли я их использую.

Вот что у меня есть:

/************************
* Переменные
************************/
global $bClass, $cClass, $dClass, $cExpiry;
       $bClass = $cClass = $dClass = $cExpiry =  get_option('myoption');

Затем, поскольку я использую одну опцию для сохранения соответствующих переменных в массиве, я вывожу значение так:

jquery

expires: <?php global $cExpiry; echo $cExpiry['cExpiry']; ?>,

и затем я также использую это в других функциях на той же странице.

Это работает для меня, но я всё ещё сомневаюсь, правильно ли я это делаю.

обновление Спасибо за объяснение, ребята. В итоге я стал использовать локальные переменные и также нашел ошибку в своем коде;

Поскольку все мои переменные сохранены в одной опции, я просто использовал одну локальную переменную:

$options = get_option('myoption');

Затем я получаю доступ к массиву, помещая переменную внутри скобок:

<?php echo $options['var1']; ?>

Тогда как раньше я делал $bClass = $cClass = $dClass = $cExpiry = get_option('myoption');, что является плохой практикой.

3
Комментарии

Это вопрос по PHP, так что лучше задать его на stackoverflow, и да, обычно так делать не рекомендуется.

Wyck Wyck
27 сент. 2013 г. 03:08:07

Нет причин закрывать этот вопрос. Это не только вопрос по PHP. Это также вопрос локализации скрипта, так что он соответствует тематике. Смотрите ответ.

kaiser kaiser
27 сент. 2013 г. 04:10:23

Можно использовать глобальные переменные. Они не так уж плохи. Просто будьте немного осторожны. Называйте их более непредсказуемо, например: $GLOBALS['first_global_unprdictable_name'] = '123'; – beginner 1 min ago edit

beginner beginner
4 июл. 2017 г. 02:46:42
Все ответы на вопрос 1
1

Есть более простые способы, чем этот. Как уже отметил @Wyck, использование глобальных переменных — плохая идея. Вот краткое объяснение и инструкции:

Почему глобальные переменные — это плохо:

1) К ним может получить доступ кто угодно и где угодно. Сначала это кажется удобным, но можно столкнуться с такой ситуацией:

// Ваш код: значение по умолчанию
global $foo;
$foo = 'bar';

// Пользовательская настройка:
global $foo;
$foo = get_option( 'baz' );

// Позже в вашем коде
if ( 'bar' === $foo )
    // выполнить что-то важное

// А теперь я, конечный пользователь, делаю это в шаблоне
// или Эрни, начинающий разработчик, делает это в своём стороннем плагине:
$GLOBALS['foo'] = 42;

И внезапно ничего не работает, как ожидалось. Проще говоря: глобальные переменные можно перехватить. Они не защищены от конфликтов, и никто никогда не может быть уверен, что они содержат.

2) Теперь, когда вы знаете, что их значения могут меняться на лету, становится ясно, что они непредсказуемы. Если вы попытаетесь отследить их в IDE (например, PHPStorm, Eclipse/Aptana и т. д.), то никогда не найдёте их источник или точное место изменения... если только не потратите много времени на использование точек останова, XDebug и других инструментов.

3) Нужно ли продолжать? Думаю, нет.

Вывод: так как большинство настроек загружаются автоматически, они уже доступны на каждой странице/запросе и не требуют обёртки в глобальную переменную. Просто вызывайте get_option() там, где это необходимо.

Как передать данные из PHP в JavaScript

Всё просто: используйте wp_localize_script().

Пример: (можно использовать с хуками login_enqueue_scripts и admin_enqueue_scripts)

add_action( 'wp_enqueue_scripts', 'wpse115840_scripts' );
function wpse115840_scripts()
{
    wp_enqueue_script( 'wpse_handle', etc... );
    // Вот где происходит магия:
    wp_localize_script( 'wpse_handle', 'wspeObject', array(
        'foo' => 'bar',
        'bar' => get_option( 'baz' )
    ) );
}

Теперь вы можете получить доступ ко всем данным из массива wp_localize_script() (третий аргумент) в вашем JavaScript-файле, который вы только что зарегистрировали/добавили в очередь, просто обратившись к wpseObject. Например, следующий код выведет значение bar:

console.log( wpseObject.foo );

А wpseObject.bar будет содержать значение вашей настройки baz.

27 сент. 2013 г. 04:09:54
Комментарии

...и что, если сторонний плагин использует то же имя для ссылки в процессе add_action? Не то чтобы это очень вероятно, но если это произойдет, чем будут отличаться последствия от наличия двух перехватывающих глобальных переменных?

klewis klewis
12 окт. 2016 г. 22:53:54