2014-12-08 29 views
1

在PHP中,我總是看到例如從函數得到的數據是這樣的:我可以定義從函數到外部範圍的變量嗎?

function getSomeData(){ 
    //this function will return a array of data 
    $data_A = 'foo'; 
    $data_B = 'bar'; 
    $data_C = 42;  
    return array('data_A'=>$data_A, 'data_B'=>$data_B, 'data_C'=>$data_C,) 
} 

//1. we call the function 
$models = getSomeData(); 

//2. Now we need to define the variable by the return value. 
$data_A = $models['data_A']; 
$data_B = $models['data_B']; 
$data_C = $models['data_C']; 

//3. Then we can do whatever with those defined variable 
doSomething($data_A); 
doSomethingElse($data_B); 

這看起來平常。現在,這個怎麼樣:

function getSomeData(){ 

    $data_A = 'foo'; 
    $data_B = 'bar'; 
    $data_C = 42; 

    someMagicFunction($data_A); //this function will set variable at the upper level scope 
    someMagicFunction($data_B); 
    someMagicFunction($data_C); 

    return true; 
} 

//1. we call the function 
getSomeData(); 

//2. Then we use it right here 
doSomething($data_A); 
doSomethingElse($data_B); 

我想是嘗試跳過第2步,我將需要能夠「在上級範圍設置變量」的功能。 有時候我覺得第2步有點「不必要」 - 我認爲沒有那些代碼可以簡單而乾淨。

假設代碼是在一個類或匿名函數中,而不是在根級別中,是否有可能?如果沒有,爲什麼PHP不允許我這樣做?有沒有其他的方法來完成這項任務? (減少函數中的重複定義並再次定義外部)

+0

這是一個壞主意,要做到這一點,因爲作用域是機制來保護你的變量。但是,您可以使用全局變量來執行此操作; http://php.net/manual/en/reserved.variables.globals.php – RichardBernards 2014-12-08 08:25:16

+0

「假設代碼位於類或匿名函數中,而不是根級」 – LunaCat 2014-12-08 08:25:46

+0

呃...使用類變量和'$ this' ?我可能不是很瞭解你的問題......請給出一個確切的例子,說明你想如何工作... – RichardBernards 2014-12-08 08:27:36

回答

2

如果函數返回一個數組。這是有道理的。一個函數只應該使用給它的東西,如果需要的話返回一個結果。它不應該設置任何全局變量(除非該函數被稱爲setGlobalVariable,那麼它有一個原因)。

如果您想將返回的數組映射到變量。使用list

list($a,$b,$c) = getSomeData(); 
+0

這是一個好主意,雖然「語法」對我來說看起來很奇怪。它應該更像'list(getSomeData(),array('a','b','c'))'更合理。 – LunaCat 2014-12-08 08:46:14

+0

它看起來像這樣:只有上層作用域「應該」能夠控制/更改下層作用域(通過在調用時使用參數,或者在較低層作用域內調用某個已定義的函數),但是更低層作用域「對上一級有效。但是,關於這是爲什麼呢? – LunaCat 2014-12-08 08:54:05

+0

你的語法看起來更奇怪。那裏的列表函數會在'上層'中創建變量。這不好。你爲什麼問?常識。它保持代碼清潔。減少錯誤,......這些規則是由於不得不調試愚蠢的全局$ varA而造成的規則;代碼 – Pinoniq 2014-12-08 09:51:47

-1

嘗試......

$data_A = ''; 
$data_B = ''; 
$data_C = ''; 

function getSomeData(){ 
//this function will set variable at the upper level scope 
global $data_A, $data_B, $data_C; //Using global 

$data_A = 'foo'; 
$data_B = 'bar'; 
$data_C = 42; 

return true; 
} 

//1. we call the function 
getSomeData(); 

//2. Then we use it right here 
doSomething($data_A); 
doSomethingElse($data_B); 
+0

RichardBernad說,這是一個壞主意,它只是你可以實現你的輸出的方式... – Pankaj 2014-12-08 08:33:21

+0

爲什麼'someMagicFunction'仍然存在於你的例子中? – 2014-12-08 08:34:10

+0

哎呀....謝謝你Syed :) – Pankaj 2014-12-08 08:35:40

相關問題