通过调用另一个函数设置函数中的静态变量

时间:2010-12-07 17:12:20

标签: php function variables static call

我在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"
    );
}

以上不起作用。它导致错误 - 意外'(',期待','或';'。

我确实认识到它会起作用,它会通过引用传递,从而消除开销,但是这需要额外的工作来确保对来自calledRepeatedly的调用实际上在参数列表中有数据集。

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:11)

我会在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中似乎更清晰。

答案 1 :(得分:3)

虽然您无法将函数的结果直接分配给静态变量,但您仍然可以捕获返回值并分配给静态变量:

<?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

答案 2 :(得分:0)

如@Mark所述,您无法将表达式分配给静态变量。更好的解决方案是使用某种缓存机制(如APC)来存储结果,而不是尝试使用静态变量。