Статическая переменная в функции устанавливается путем вызова другой функции - PullRequest
5 голосов
/ 07 декабря 2010

Я работаю в PHP.

У меня есть функция (F1), которая вызывается переменное количество раз.В этой функции мне нужно загрузить постоянный набор данных из другой функции (F2).Загружается всегда один и тот же набор данных, однако загрузка набора включает в себя поиск и обработку в базе данных.Вместо многократного вызова F2 и увеличения требований к накладным расходам / избыточности / обработке, я хотел бы поместить результат в статическую переменную в F1.Однако, по какой-либо причине, это не позволит мне установить переменную как статическую, используя вызов функции.

Пример кода:

function calledRepeatedly() {
    static $dataset = loadDataset();
    // some minor processing here using the dataset
    // and probably a loop
    return "stuff";
}
function loadDataset() {
    //intensive dataset load code
    //plus a database lookup or two
    //whatever else
    return array(
        "data1",
        "data2"
    );
}

Выше НЕ работает.Это приводит к ошибке - неожиданно '(', ожидая ',' или ';'.

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

Есть ли способ сделать это?

Ответы [ 3 ]

11 голосов
/ 07 декабря 2010

Я бы кинул статическое объявление в loadDataset.Я добавил логическое значение, чтобы определить, обновлять ли данные из базы данных.Основной процесс заключается в следующем: определить статическую переменную, а не устанавливать ее для чего-либо.Затем проверьте, установлено ли оно (или если $refresh было установлено в true).Если это не так, загрузите интенсивные данные из базы данных.

function loadDataset($refresh = false) {
    static $dataset;
    if( !isset($dataset) || $refresh )
    {
        $dataset = array();
        //intensive dataset load code
        //plus a database lookup or two
        //whatever else
    }
    return $dataset;
}

Редактировать: Конечно, вы все еще можете использовать шаблон static ... isset в своей исходной функции, но он казался чищеположить в loadDataset.

3 голосов
/ 07 декабря 2010

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

<?php

function calledRepeatedly() {
    static $dataset = false;
    if (!$dataset) {
      echo "dataset is empty, fetching data\n";
      $v = expensive();
      $dataset = $v;
    }
    echo "$dataset\n";
}

function expensive() {
  return 'complex data structure';
}

calledRepeatedly();
calledRepeatedly();
calledRepeatedly();

Выход:

dataset is empty, fetching data
complex data structure
complex data structure
complex data structure
0 голосов
/ 07 декабря 2010

Как прокомментировал @Mark, вы не можете присвоить выражение статической переменной.Вместо того чтобы пытаться использовать статические переменные, лучшее решение - использовать какой-то механизм кэширования, такой как APC, для хранения результата.

...