2012-07-14 665 views
1

目前我有以下代碼從內PHP函數調用的變量在外部函數使用

我「function.php」裏面是

function calcTime($database_name,$currentTime){ 

    global $startTime; 
    global $endTime; 

    ...calcutions 

    return $startTime; 
    return $endTime; 
}//end calcTime() 

內我主「的index.php」我有

include('/function.php'); 

$databaseName = foo; 

$currentTime = 12.30; 

function begin($database_name,$currentTime){ 

    ...some calculations 

    calcTime($database_name,$currentTime); //calling the function from other file 

echo $startTime; 

echo $endTime; 

}// end begin() 

我遇到的問題是在內部函數內聲明的變量不會傳遞給外部函數。我已經聲明瞭變量全局變量並將其返回。不知道發生了什麼事。

但有趣的是,如果我回聲calcTime($ database_name,$ currentTime); $ startTime被返回,但不是$ endTime。

請幫忙。我有一些函數用於我希望以這種方式使用的其他函數。謝謝!!

+0

我不是PHP'global'的專家,但至少我知道你不必返回什麼是全局的,或者不必設置全局的,你返回的是什麼。我認爲**(這是我不確定的地方),當你在一個函數中使用它之前,你有一個已經存在於外部代碼**中的變量時使用'global'。但是在你的代碼中,$ startTime在函數調用之前不會被使用**。只需使用'list($ startTime,$ endTime)= calcTime($ database_name,$ currentTime);'並移除這兩個'global'命令。當然,將兩個'return'更改爲'return array($ startTime,$ endTime);' – Aufziehvogel 2012-07-14 19:12:56

+0

您只能從函數返回一次。但是,您可能會返回一組值或一個對象。 – knittl 2012-07-14 19:14:26

回答

2

global關鍵字PHP用於訪問在函數之外聲明的全局變量。這是寫作$var =& $GLOBALS['var']的句法糖。

至少有兩個選項是如何,你可以從你的函數返回的兩個變量:調用 - ref或返回一個數組:

function calcTime($database_name,$currentTime){ 
    return array('start' => $startTime, 'end' => $endTime); 
} 

$times = calcTime(…, …); 
echo $times['start'], ' and ', $times['end']; 
// or: 
list($start, $end) = calcTime(…, …); 
echo $start, ' and ', $end; 

或者,傳遞的參數作爲參考:

function calcTime($database_name,$currentTime, &$startTime, &$endTime){ 
    $startTime = …; 
    $endTime = …; 
} 

$startTime = 0; 
$endTime = 0; 
calcTime(…, …, $startTime, $endTime); 
echo $startTime, ' and ', $endTime; 
+0

完美,謝謝你的解釋。 – 2012-07-14 21:53:16

2

簡單地說:主叫範圍不global範圍要麼...所以爲它工作,變量會已經被宣佈global那裏。請注意(全部)使用全局變量被認爲是不好的做法,並且會爲你的同伴調試器(或者甚至在你經過一段時間後)進行調試。好評參數&返回。

**記住每一個功能被隔離在PHP,當你設置一個功能,這將是可見的只有功能範圍當然

的全局或變量,你只能返回一個值,但該很可能會成爲一個更復雜的一個,如:

return array('startTime' => $startTime,'endTime' => $endTime); 
2

的第一個問題是,在global PHP是有點反直覺。我知道這讓我困惑。它不會在外部可訪問的函數內創建一個變量;相反,它可以讓你在被宣佈之外的功能,如使用變量:

$foo = 'hello'; 
function bar() { 
    global $foo; 
    echo $foo; 
} 

你想要做的是返回兩個變量。但是,您只能使用return一次。只要PHP達到return聲明,它就結束該函數,因此第二個函數從不運行。

我會建議做的是返回一個包含兩個值的數組,例如:

return array('startTime' => $startTime, 'endTime' => $endTime); 

然後,您可以使用extract使他們再次變量:

extract(calcTime()); 
echo $startTime; 
echo $endTime; 
+0

感謝您使用全局變量解釋問題。我不知道。在函數中聲明一個全局變量或通過函數傳遞變量之間有什麼區別?例如,在上面的例子中,爲什麼不只是功能欄($ foo)?這樣做還是有利於這樣做? – 2012-07-14 21:51:21

+0

更少的全局變得更好。如果你可以傳遞一個變量作爲參數,那麼做。 – knittl 2012-07-15 10:01:03