2014-12-08 43 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

相关问题