這可能不是最明智的問題,但是是否可以從函數返回變量而不重新聲明它?從函數返回變量
function test(){
$a = 1;
return $a;
}
難道只要調用該函數就可以訪問$ a嗎?測試();
not $ a = test();
這是唯一的方法嗎?我想在調用函數後使$ a可用。
這可能不是最明智的問題,但是是否可以從函數返回變量而不重新聲明它?從函數返回變量
function test(){
$a = 1;
return $a;
}
難道只要調用該函數就可以訪問$ a嗎?測試();
not $ a = test();
這是唯一的方法嗎?我想在調用函數後使$ a可用。
你必須把變量到全局範圍:
function test()
{
$GLOBALS['a'] = 'Hello World!';
}
test();
echo $a;
但它會更好地使用返回值或引用:
function test(&$ref)
{
$ref = 'Hello World!';
}
$var = '';
test($var);
不,不是由於範圍界定。
一個選項是先聲明$ a然後使其成爲全局的。然後它將在測試中可用:
$a = '';
function test(){
global $a;
$a = 1;
return $a;
}
echo $a; // 1
但是我可以問你爲什麼要這樣做嗎?你只是在玩遊戲嗎?或者你有用例嗎?如果你需要這個,你很可能做錯了。
我正在重新編碼一個腳本。大多數頁面使用之前全局定義的變量。我做了一個會話檢查函數,在用戶登錄的情況下返回相同的變量。我想我會節省一些時間。 – domino
也許如果你只是想顯示的變量,你可以以這種方式使用
function test(){
$a = 1;
echo $a;
return $a;
}
,如果你願意,你可以保存變量$ a的變量,如果沒有你可以只顯示它調用測試功能。
希望它有幫助。
Nicola。
我假設你想調用函數時改變一些上下文。
這是可能的。例如,所有全局變量在您的應用程序中共享相同的上下文。如果設置一個功能是一個global variable,其在全球範圍內都有效:
function change_global_variable($name, $value)
{
$GLOBALS[$name] = $value;
}
change_global_variable('a', 1);
echo $a;
然而,當你做這樣的事情,照顧你正在摧毀你的代碼的模塊化。例如,如果你有50個這樣的函數和80個變量,然後你需要改變一些東西,你需要改變許多地方。更難的是,你不記得你需要改變哪些地方,以及它們是如何相互依賴的。
它通常更好地使上下文對象並將其傳遞給改變了它的功能,所以它更清晰的功能是什麼:
class Context extends ArrayObject {}
$context = new Context;
function change_context(Context $context, $name, $value)
{
$context[$name] = $value;
}
change_context($context, 'b', 2);
echo $context['b'], "\n";
此示例演示的東西,就是所謂的依賴注入。不是修改PHP中唯一的一個(全局)上下文,而是告訴函數它應該修改什麼,而不是修改硬編碼的全局變量
它有一種混合形式,它使用全局變量範圍來包含上下文,因此您可以將其作爲附加參數傳遞給它,但是爲了完整起見,我僅在此處顯示它,因爲它不能幫助保留好模塊性(但要比使用多個全局變量更好):
class Context extends ArrayObject {}
$context = new Context;
function change_global_context($name, $value)
{
global $context;
$context[$name] = $value;
}
change_global_context('c', 3);
echo $context['c'], "\n";
經驗法則:避免全局變量。考慮到它們非常昂貴,你不希望你的代碼很昂貴。
你是什麼原因?只是一時興起? –
只是有興趣知道。我有大約30頁調用一個函數,返回這些頁面使用的變量。我想我可以節省一些時間。 – domino
節省什麼時間?輸入'$ var ='?我的天啊。你問這個問題已經十次了。並且使你的代碼變得更糟。 –