2010-12-07 69 views
5

我正在使用PHP。通过调用另一个函数设置的函数中的静态变量

我有一个函数(F1)被称为可变的次数。在该函数中,我需要从另一个函数(F2)加载一个常量数据集。它始终加载相同的数据集,但加载该集合涉及一些数据库查找和处理。不是反复调用F2并增加开销/冗余/处理要求,我想将结果放入F1中的静态变量。但是,无论出于何种原因,它都不允许我使用函数调用将该变量设置为静态。

A码例如:

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实际上在参数列表中的数据集。

有没有办法做到这一点?

+4

您不能将表达式存储在静态变量中。它们在编译时被解析,所以函数不能被调用。我不知道如果PHP支持静态功能。 – 2010-12-07 17:16:43

+0

如何制作课程并将其保存在一个属性中? ;-) – thedom 2010-12-07 17:19:14

回答

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

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 
0

正如@Mark所评论的,您不能将表达式分配给静态变量。与其试图使用静态变量,更好的解决方案是使用某种缓存机制(如APC)来存储结果。

相关问题