我在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的调用实际上在参数列表中有数据集。
有没有办法做到这一点?
答案 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)来存储结果,而不是尝试使用静态变量。