将数组变量从一个函数传递给后续函数的正确方法是什么

时间:2017-10-18 17:23:46

标签: php function

以下两种技术似乎都可行。我想知道哪种技术是最合适的技术。

// parameters
$text_str = 'antique picture';
$error_arr = array();

$error_arr变量包含在参数中:

function step_one($text_str,$error_arr) {
 global $error_arr;
 //... some code goes here ...
 $error_arr['step_one'] = true; 
}

function step_two($text_str,$error_arr) {  
  global $error_arr;
 //... some code goes here ...
 $error_arr['step_two'] = true; 
}

// call the two functions that have $error_arr included in the parameters
step_one($test_str,$error_arr);
step_two($text_str,$error_arr);

// they output the following
print_r outputs array('step_one' => 1)
print_r outputs array('step_one' => 1, 'step_two' => 1)

参数中省略了$error_arr变量。

function step_one($text_str) {  
 global $error_arr;
 //... some code goes here ...
 $error_arr['step_one'] = true; 
}

function step_two($text_str) {  
  global $error_arr;
 //... some code goes here ...
 $error_arr['step_two'] = true; 
}

// call the functions that have the $error_arr variable omitted from the parameters
step_one($text_str);
step_two($text_str);

// the last two functions have exactly the same output as the
// first two functions even though the `$error_arr` is not included 
// in the parameters

print_r outputs array('step_one' => 1)
print_r outputs array('step_one' => 1, 'step_two' => 1)

我在共享主机上运行PHP 7.1。我在控制面板中打开了display_errors

如果我在参数中包含$error_arr变量,或者如果我使用省略参数中$error_arr变量的函数,PHP不会抛出任何错误消息。

2 个答案:

答案 0 :(得分:0)

您可以拥有以下内容:

$error_arr = [
  'step_one' => step_one($text_str),
  'step_two' => step_two($text_str),
];

从问题不清楚这个代码的目的是什么,所以一些方法或其他可能更好。例如,如果您需要在此特定位置分几个步骤处理$text_str - 您可以使用闭包:

$processing = [
  'step_one' => function($str) { /* some code */ return true },
  'step_two' => function($str) { /* some code */ return true },
];
$results = [];
foreach($processing as $func) {
  array_push($results, $func($text_str));
}

如果您希望这些函数共享一些变量 - 您可以通过use子句传递它:

$shared = [];
$processing = [
  'step_one' => function($str) use ($shared) { /* some code */ return true },
  'step_two' => function($str) use ($shared) { /* some code */ return true },
];
$results = [];
foreach($processing as $func) {
  array_push($results, $func($text_str));
}

答案 1 :(得分:0)

这两种技术实际上是相同的技术。

以下是一个例子:

$error_arr = ['example' => 'value'];

$not_error_arr = ['something' => 'else'];

function step_one($text_str, $error_arr) {
    global $error_arr;
    $error_arr['step_one'] = true;
}

step_one('foo', $not_error_arr);

var_dump($error_arr, $not_error_arr);

这将输出

  

数组(大小= 2)     'example'=>字符串'value'(长度= 5)'step_one'=>布尔值

     

数组(大小= 1)     'something'=>字符串'else'(长度= 4)

'step_one'值未分配给您作为参数传递的数组,因为该分配已被global $error_arr覆盖。

所以,无论你传递的是

的第二个参数
function step_one($text_str,$error_arr) {...

函数中的全局定义意味着它将被忽略。看起来你只是在写它,因为全局范围内的变量恰好与你作为参数传递的变量相同。