Как вызвать функцию только один раз (глобальная область видимости переменной)

15 мар. 2012 г., 11:56:14
Просмотры: 28.3K
Голосов: 5

Я пытаюсь разобраться с наиболее эффективным способом использования функций в WordPress.

У меня есть большая медленная функция big_slow_function(), которую желательно запускать только один раз. Но мне нужно использовать логическое значение, возвращаемое этой функцией, во всех файлах моей темы (в header.php, page.php, sidebar.php, footer.php, loop-page.php, functions.php и т.д.).

Я размышляю, как это сделать.

Я попробовал поместить следующий код в functions.php, чтобы избежать вызова big_slow_function() более одного раза:

global $my_important_boolean;

function $get_my_important_boolean()
{
    global $my_important_boolean;

    if ($my_important_boolean == NULL) // если big_slow_function() еще не была запущена
        $my_important_boolean = big_slow_function();

    return $my_important_boolean;
}

А затем я разместил такой код по всем файлам темы:

if ($get_my_important_boolean()) {
    // настройка контента для пользователя
}

Но функция big_slow_function() все равно выполняется каждый раз. Я не уверен, что делаю неправильно, и мне было сложно найти хорошую документацию по области видимости переменных в WordPress. Возможно, мне нужно передавать ссылку/указатель на переменную?

Буду очень признателен за любую помощь с этой проблемой, так как я борюсь с ней уже некоторое время.

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

Закрыто с голосованием как не по теме. Это вопрос по PHP/общему программированию, а не по WordPress.

Chip Bennett Chip Bennett
15 мар. 2012 г. 14:53:53

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

Ben Pearson Ben Pearson
16 мар. 2012 г. 07:21:25

@ChipBennett Если голосуете за закрытие, то вы действительно должны нажать на ссылку для голосования.

kaiser kaiser
3 окт. 2012 г. 16:24:15

@kaiser Я не согласен. Дизлайк означает, что сам вопрос плохого/низкого качества. Голос за закрытие как не по теме просто указывает, что вопрос относится к другой теме.

Chip Bennett Chip Bennett
3 окт. 2012 г. 23:31:01

@ChipBennett Я написал голос за закрытие, а не дизлайк... Ты же тоже так не сделал, верно? :)

kaiser kaiser
4 окт. 2012 г. 09:32:19

@kaiser Вообще-то, да, сделал. :)

Chip Bennett Chip Bennett
5 окт. 2012 г. 07:04:24

@ChipBennett Тогда у нас баг. Я вижу только один голос за закрытие, и это мой.

kaiser kaiser
5 окт. 2012 г. 11:02:25

@kaiser Похоже на то. Я наблюдаю то же самое.

Chip Bennett Chip Bennett
5 окт. 2012 г. 22:02:10

@ChipBennet отправил жалобу

kaiser kaiser
6 окт. 2012 г. 18:54:02

Не баг: http://meta.stackexchange.com/questions/120896/why-do-close-votes-expire

fuxia fuxia
6 окт. 2012 г. 18:59:11
Показать остальные 5 комментариев
Все ответы на вопрос 1
2
16
function my_big_function() {

    static $result;

    // Функция уже была выполнена
    if ( $result !== null )
        return $result;

    // Много работы здесь для определения $result
    $result = 'whatever';

    return $result;
}

Смотрите также: https://stackoverflow.com/questions/6188994/static-keyword-inside-function

15 мар. 2012 г. 14:39:46
Комментарии

Идеально. Именно то, что я искал. Большое спасибо, Геерт.

Ben Pearson Ben Pearson
16 мар. 2012 г. 07:19:07

Дополняя этот ответ, и также потому что я не вижу упоминания об этом в комментариях, PHP функции не могут начинаться с символа $, так как он зарезервирован для $переменных в PHP.

DaveyJake DaveyJake
19 мар. 2017 г. 00:35:05