2011-11-06 201 views
0

這可能不是最明智的問題,但是是否可以從函數返回變量而不重新聲明它?從函數返回變量

function test(){ 
$a = 1; 
return $a; 
} 

難道只要調用該函數就可以訪問$ a嗎?測試();

not $ a = test();

這是唯一的方法嗎?我想在調用函數後使$ a可用。

+0

你是什麼原因?只是一時興起? –

+0

只是有興趣知道。我有大約30頁調用一個函數,返回這些頁面使用的變量。我想我可以節省一些時間。 – domino

+0

節省什麼時間?輸入'$ var ='?我的天啊。你問這個問題已經十次了。並且使你的代碼變得更糟。 –

回答

1

你必須把變量到全局範圍:

http://codepad.org/PzKxWGbU

function test() 
{ 
    $GLOBALS['a'] = 'Hello World!'; 
} 
test(); 
echo $a; 

但它會更好地使用返回值或引用:

function test(&$ref) 
{ 
    $ref = 'Hello World!'; 
} 
$var = ''; 
test($var); 
+0

你爲什麼低調? – ComFreek

+0

我沒有,謝謝。 – domino

0

不,不是由於範圍界定。

一個選項是先聲明$ a然後使其成爲全局的。然後它將在測試中可用:

$a = ''; 

function test(){ 
    global $a; 
    $a = 1; 
    return $a; 
} 

echo $a; // 1 

但是我可以問你爲什麼要這樣做嗎?你只是在玩遊戲嗎?或者你有用例嗎?如果你需要這個,你很可能做錯了。

+0

我正在重新編碼一個腳本。大多數頁面使用之前全局定義的變量。我做了一個會話檢查函數,在用戶登錄的情況下返回相同的變量。我想我會節省一些時間。 – domino

-1

也許如果你只是想顯示的變量,你可以以這種方式使用

function test(){ 
    $a = 1; 
    echo $a; 
    return $a; 
} 

,如果你願意,你可以保存變量$ a的變量,如果沒有你可以只顯示它調用測試功能。

希望它有幫助。

Nicola。

1

我假設你想調用函數時改變一些上下文。

這是可能的。例如,所有全局變量在您的應用程序中共享相同的上下文。如果設置一個功能是一個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"; 

經驗法則:避免全局變量。考慮到它們非常昂貴,你不希望你的代碼很昂貴。