2010-12-07 75 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)來存儲結果。

相關問題