Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以定义从函数到范围外的变量吗?_Php - Fatal编程技术网

Php 我可以定义从函数到范围外的变量吗?

Php 我可以定义从函数到范围外的变量吗?,php,Php,在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, ) } /

在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步,我需要一个函数,可以“设置变量在上层范围”。 有时我觉得第二步有些“不必要”——我认为没有这些,代码可以简单而干净


假设代码在类或匿名函数中,而不是在根级别,是否可能?如果不是,为什么PHP不允许我这样做?有没有其他方法来完成这项任务?(如果函数返回数组,则减少重复的在函数中定义并再次在外部定义)

。它这样做是有道理的。函数应该只使用给定给它的内容,如果需要,返回一个结果。它不应该设置任何全局变量(除非该函数被称为setGlobalVariable,那么它是有原因的)

如果要将返回的数组映射到变量。使用

试试这个

$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); 

这样做是个坏主意,因为作用域是保护变量的机制。但是,您可以使用globals来实现这一点;“假设代码在类或匿名函数中,而不是在根级别”嗯。。。使用类变量和
$this
?我可能对你的问题理解得不够好。。。请给出一个你希望事情如何运作的确切例子…正如RichardBernad所说,这是一个坏主意,这只是你实现输出的方式…为什么
someMagicFunction
仍然存在于你的例子中?使用global将在根级别上改变,但我在问“上层”。在我看来,有一个“缺失的链接”当A调用B时,B不能访问A,甚至不知道有A。这是个好主意,尽管“语法”对我来说很奇怪。它应该更像
list(getSomeData(),array('a','b','c'))
,然后才更有意义。它看起来是这样的:只有上级作用域“应该”能够控制/更改下级作用域(在调用时使用参数,或者在下级作用域内调用某些已定义的函数),而下级作用域“永远不应该”做一个更高层次的效果。但为什么会这样,还有什么进一步的解释吗?依我看,你的语法看起来更奇怪。在那里,list函数将在“上层”中创建变量。这很糟糕。你为什么问?常识。它保持代码的整洁。更少的错误。。。这些规则是程序员制定的,他们厌倦了调试愚蠢的全局$varA;代码在我的示例中,不会出现一些错误。我想说它会很糟糕,就像“全局”函数一样——它可能会很糟糕,这取决于用户如何使用它,但有时我们可能需要它。但是我不认为“它可能会产生坏代码”==它不应该存在。我在我的问题中告诉了一个原因“为什么我会问”——“减少函数中的重复定义,并重新定义外部”。在这一刻,还没有人解释为什么这是坏的主要原因,如果我们这样做会发生什么…到目前为止。尽管如此,它还是有很多缺点,我想使用这个函数来加快编码速度,以制作“快速而肮脏(但仍在工作)的原型”。以后要把代码弄干净,我们都知道我们不可能一次完成完美的代码,完美是一个过程。
$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);