2011-02-03 53 views
1

我有以下部分的腳本:如何修改變量是在PHP函數外/更好的方式做一些

function checkDays($oldDate){ 
    // calculate time 
    // Print table row style based on number of days passed 
    // (eg less than 1 week, 1 week, 2 weeks, 3weeks+) 
} 

//Some code 
checkdays($value) 

我想提出的每個時間段的多少條記錄計數器有,函數本身是在一個循環內部,所以它調用表中的每一行,我似乎無法訪問函數本身外部定義的變量,所以我可以改變它們(例如,把一個計數器放在頂部腳本並從函數中修改它)。

有人說使用全局變量,但我知道這是一個風險,不建議。有沒有簡單的方法來訪問函數中的變量?另外,還有更好的方式來做我在這裏總體做的事嗎?

回答

2

我認爲你所指的風險是register_globals,這完全是另一回事。

函數內部使用關鍵字global

function myFunction($someParam) { 
    global $counter; 
    ++$counter; 
    // do something 
} 

或者,你可以做什麼叫做傳遞按引用的則傳遞給你的函數,例如外部範圍修改變量

function myFunction($someParam, &$counter) { 
    ++$counter; 
    // do something 
} 

注意&符號。

更多信息,請在PHP Manual page about Variable Scope

+0

一旦函數運行完畢並且第二次被調用,是否會重置? – Mankind1023 2011-02-03 16:59:12

+0

全球不平等 – 2011-02-03 17:00:05

+0

不,全局關鍵字表示您在最外層(全局)範圍內引用一個變量。所以,實質上,名爲`$ counter`的全局變量將是第一個例子中增加的變量。與在此使用`global`關鍵字時使用的`static`關鍵字相反,它將通過對同一個函數的多個調用來維護變量的值,但不會使其可訪問,也不會修改,任何外部範圍,包括全局範圍。 – Dereleased 2011-02-03 17:01:06

4

不要試圖使用方法全局

您可以通過引用傳遞變量,這意味着實際的變量傳遞,而不是它的一個副本:

$count = 0; 

//Some code 
checkdays($value, $count); 
checkdays($value, $count); 
checkdays($value, $count); 

// This will output 3 
echo $count; 

// Use a & to pass by reference 
function checkDays($oldDate, &$count){ 
    // Your code goes here as normal 
    // Increment $count, because it was passed by reference the 
    // actual variable was passed 
    // into the function rather than a copy of the variable 
    $count++; 
} 
0

不是用無用的變量來污染全局名稱空間,而是可以定義靜態成員函數,它超出了函數的範圍,但只存在於智能欣功能範圍:

function myFunction($param) 
{ 
    static $count; 
    if (empty($count)) $count = 0; 
    $count++; 

    //rest of your function 
} 

不幸的是,我似乎無法找到哪裏此功能在PHP的文檔記錄。 找到它:variable scope

我似乎無法訪問

我錯過了這條線本身的功能之外定義的變量。

如果您處於OOP範例中,請使用對象來存儲計數器。否則,全局變量是要走的路,但不是直接的。如果您使用腳本模式進行編碼,並且您使用的是最新版本的PHP,請使用namespaces防止污染根名稱空間的全局變量。

如果不能使用名稱空間,請使用僞命名空間,全部爲。而不是function someFunction,請使用function projectName_someFunction或其某些組合。這樣你可以組合多個項目而不用擔心使用錯誤的功能。以同樣的方式,所有全局變量可以被存儲爲$projectName_someVar

還有其他方法可以僞名稱化您的函數/變量名稱。

原因使用全局變量是有一個共同的名字的全局變量可以很容易地被覆蓋,並且可能是模糊的:這是什麼$count實際上計數在全局命名空間?

相關問題